我必须使用数据帧(A和B)。 B包含新值,A包含过时的值。
每个数据框的一列代表键,另一列代表值。
我想将B中的行添加到A,然后清除包含A中重复键的行(使用B中的新值更新A)。顺序并不重要,我认为在其他顺序中更容易:清理重复项然后追加。
此刻,我已经完成了这个脚本:
A <- bind_rows(B, A)
A <- A[!duplicated(A),]
我遇到的问题是它不能清除行,因为它们不是真正的重复项(值不同)。
我该如何处理?
答案 0 :(得分:2)
这只是预感,因为没有提供示例数据,但是我怀疑合并比行绑定更安全:
data.table解决方案
GetKey()
1-重命名变量以准备合并
library(data.table)
2-合并,请确保使用setnames(A, old="value", new="value_A")
setnames(B, old="value", new="value_B")
arg
all
3-使用一些规则进行更新-例如:使用dt <- merge(A, B, by="key", all=TRUE)
除非丢失,否则使用value_B
value_A
使用Base R的解决方案
dt[ , value := value_B]
dt[is.na(value), value := value_A]
dplyr / tidyverse解决方案
names(A) <- c("key", "value_A")
names(B) <- c("key", "value_B")
df <- merge(A, B, by="key", all=TRUE)
df$value <- df$value_B
df[is.na(df$value), "value"] <- df[is.na(df$value), "value_A"]
示例数据
library(dplyr)
df <- full_join(A, B, by="key") %>%
mutate(value = ifelse(is.na(value_B), value_A, value_B))