使用dplyr或其他解决方案从另一个data.frame更新data.frame的几行和几列

时间:2015-02-03 12:36:25

标签: r dplyr

假设我有以下data.frames:

library(dplyr)
set.seed(13)
df <- data_frame(A = sample(letters[1:2], 6, rep=TRUE), B = sample(1:3, 6, rep = TRUE))
new_df <- data_frame(A ="a", B = 4)

假设我想更新df A == "a"的所有行,其中4的值为df(这是一个示例,一般df %>% left_join(new_df %>% rename(b=B)) %>% mutate(B = ifelse(is.na(b), B, b)) 有多行) 。我可以通过以下方式做到这一点:

{{1}}

哪个好,但这看起来并不优雅。有一个更好的方法吗?

我通过清理数据来解决这个问题。我从另一列计算某个列,该列应该是唯一的id,但由于数据收集问题,它不是。我有另一个表格,正确的ID,我想更新它们。通常,与正确ID的数量相比,错误ID的数量较少,因此进行连接似乎是一种过度杀伤。

2 个答案:

答案 0 :(得分:4)

好吧,如果你正在寻找优雅(和快速),那么你可以在这里如何替换这些价值:

library(data.table)

dt = as.data.table(df) # alternatively call setDT to convert in-place
setkey(dt, A)

dt[new_df, B := i.B]
dt
#   A B
#1: a 4
#2: a 4
#3: a 4
#4: a 4
#5: b 2
#6: b 2

两个音符。您会收到警告,因为data.table非常注意两个表格的类型和类型不匹配。第二个注释 - i.确保您使用B的{​​{1}}列,即i-expression的第一个参数,并用于解决此处的冲突。< / p>

答案 1 :(得分:1)

它不需要dplyr但是如何:

df$B <- ifelse (df$A=="a",4,df$B)