我有以下数据:
x <- c("aaa", "bbb", "ccc", "ddd", "eee")
y <- c(1, 0, 0, 1, 1)
df1 <- data.frame(x,y)
x <- c("aaa", "bbb", "ccc", "ddd", "eee")
y <- c(1, 1, 1, 1, 0)
df2 <- data.frame(x,y)
结构:
> df1
x y
1 aaa 1
2 bbb 0
3 ccc 0
4 ddd 1
5 eee 1
> df2
x y
1 aaa 1
2 bbb 1
3 ccc 1
4 ddd 1
5 eee 0
我想跟踪df1
和df2
之间的变化。
如果我anti_join(df2,df1)
我可以保留已经发生变化的事情:
x y
eee 0
ccc 1
bbb 1
但我想知道什么,以及从df1
到df2
的情况如何变化。例如:
x y.from y.to
eee 1 0
ccc 0 1
bbb 0 1
提前致谢。
答案 0 :(得分:4)
你可以尝试
index<-(df1$y!=df2$y)
cbind(df1[index,], df2[index,"y"])
答案 1 :(得分:3)
试试这个:
#merge on column x
df3 <- merge(df1,df2,by="x")
#show the change
df3[ df3[,2] != df3[,3],]
# x y.x y.y
# 2 bbb 0 1
# 3 ccc 0 1
# 5 eee 1 0
答案 2 :(得分:3)
这是类似的data.table
方法
library(data.table)
setkey(setDT(df1), x)
df1[df2][y != i.y]
# x y i.y
# 1: bbb 0 1
# 2: ccc 0 1
# 3: eee 1 0
答案 3 :(得分:0)
小猪退出@ zx8754这是一个使用dplyr
的hacky filter()
版本:
library(dplyr)
df3 <- merge(df1,df2,by="x") %>%
filter(y.x != x.x)
# x y.x y.y
# 2 bbb 0 1
# 3 ccc 0 1
# 5 eee 1 0