将基于其他 DataFrame 的 DataFrame 中的值替换为列名和值

Replace values in dataframe based on other dataframe with column name and value

提问人:Nina van Bruggen 提问时间:9/14/2022 最后编辑:Nina van Bruggen 更新时间:9/15/2022 访问量:499

问:

假设我有一个分数数据框

library(dplyr)

id <- c(1 , 2)
name <- c('John', 'Ninaa')
score1 <- c(8, 6)
score2 <- c(NA, 7)

df <- data.frame(id, name, score1, score2)

犯了一些错误,所以我想纠正它们。我的更正在不同的数据帧中。

id <- c(2,1)
column <- c('name', 'score2')
new_value <- c('Nina', 9)
corrections <- data.frame(id, column, new_value)

我想在数据帧中搜索正确的 id 和列并更改值。 我已经尝试了匹配的东西,但我不知道如何改变正确的列。

df %>% mutate(corrections$column = replace(corrections$column, match(corrections$id, id), corrections$new_value))
r dplyr 替换 匹配

评论


答:

3赞 akrun 9/14/2022 #1

我们可以通过“id”连接,然后根据将相应的列名 () 与列匹配来连接在 和 元素中指定的列mutateacrosscolumnreplacecur_column()

library(dplyr)
df %>% 
  left_join(corrections) %>% 
  mutate(across(all_of(column), ~ replace(.x, match(cur_column(), 
     column), new_value[match(cur_column(), column)]))) %>% 
  select(names(df))

-输出

  id name score1 score2
1  1 John      8      9
2  2 Nina      6      7

评论

1赞 Nina van Bruggen 9/14/2022
非常感谢你,我从来没有想到过这一点。我检查了一下,它有效!
0赞 Nina van Bruggen 9/15/2022
我刚刚发现,如果您对一个 ID 进行多次更正,则此解决方案不起作用。不过,它对我提出的问题很有效!
2赞 Darren Tsai 9/14/2022 #2

这是一个可行想法的实现,尽管它涉及多个包的函数。在实践中,我更喜欢适度的节俭方法。dplyr::rows_update

library(tidyverse)

corrections %>%
  group_by(id) %>%
  group_map(
    ~ pivot_wider(.x, names_from = column, values_from = new_value) %>% type_convert,
    .keep = TRUE) %>%
  reduce(rows_update, by = 'id', .init = df)

#   id name score1 score2
# 1  1 John      8      9
# 2  2 Nina      6      7

评论

0赞 Nina van Bruggen 9/15/2022
实际上,如果您对一个 ID 进行了多次更正,这就是有效的解决方案。