假设我有以下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的数量较少,因此进行连接似乎是一种过度杀伤。
答案 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)