提问人:Nina van Bruggen 提问时间:9/14/2022 最后编辑:Nina van Bruggen 更新时间:9/15/2022 访问量:499
将基于其他 DataFrame 的 DataFrame 中的值替换为列名和值
Replace values in dataframe based on other dataframe with column name and value
问:
假设我有一个分数数据框
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))
答:
3赞
akrun
9/14/2022
#1
我们可以通过“id”连接,然后根据将相应的列名 () 与列匹配来连接在 和 元素中指定的列mutate
across
column
replace
cur_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 进行了多次更正,这就是有效的解决方案。
评论