我有两个数据(A和B)。B包含新的值,A包含过时的值。
每个数据文件都有一个列表示键,另一个列表示值。
我想要从B添加行到A,然后清除包含来自A的重复键的行(用B中的新值更新A)。顺序并不重要,我认为其他顺序更容易:清理副本,然后追加。
目前,我已经完成了这个脚本:
A <- bind_rows(B, A)
A <- A[!duplicated(A),]我的问题是它没有清理行,因为它们不是真正的重复(值是不同的)。
我怎么能处理这事?
发布于 2018-08-22 17:22:28
这只是一种预感,因为没有提供示例数据,但我怀疑合并比行绑定更安全:
解决方案与data.table
library(data.table)1-重命名变量以为合并做准备
setnames(A, old="value", new="value_A")
setnames(B, old="value", new="value_B")2-合并,确保使用all arg
dt <- merge(A, B, by="key", all=TRUE)3.为更新使用一些规则--例如:除非缺少value_B,否则使用value_A,在这种情况下使用value_A
dt[ , value := value_B]
dt[is.na(value), value := value_A]带R基的解
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"]含dplyr/tidyverse的解
library(dplyr)
df <- full_join(A, B, by="key") %>%
mutate(value = ifelse(is.na(value_B), value_A, value_B))示例数据
set.seed(1234)
A <- data.frame(
key = sample(1:50, size=20),
value = runif(20, 1, 10))
B <- data.frame(
key = sample(1:50, size=20),
value = runif(20, 1, 10))https://stackoverflow.com/questions/51969965
复制相似问题