Create a new dataframe according to the contrast between two similar df
本问题已经有最佳答案,请猛点这里访问。
我有一个这样的数据框架:
1 2 3 4 | X Y Z T 1 2 4 2 3 2 1 4 7 5 NA 3 |
经过几步(不重要的是哪一步),我得到了这个df:
1 2 3 4 | X Y Z T 1 2 4 2 3 2 NA 4 7 5 NA 3 |
号
我想获得一个新的数据帧,该数据帧只由步骤中没有更改的行组成;结果是:
1 2 3 | X Y Z T 1 2 4 2 7 5 NA 3 |
我该怎么办?
您可以使用dplyr的
1 2 3 4 5 | library(dplyr) intersect(d1, d2) # X Y Z T #1 1 2 4 2 #2 7 5 NA 3 |
号
这是一个data.frame等价于base r的
如果您正在使用
1 2 3 4 5 6 7 | library(data.table) setDT(d1) setDT(d2) fintersect(d1, d2) # X Y Z T #1: 1 2 4 2 #2: 7 5 NA 3 |
使用
1 2 3 4 | dfO[do.call(paste, dfO) == do.call(paste, df),] # X Y Z T #1 1 2 4 2 #3 7 5 NA 3 |
其中"dfo"是旧数据集,"df"是新数据集
恐怕江户一八、江户一三、江户一十都不是正确答案。
从这个角度来看,我认为目前唯一正确的是Akrun的。
你也可以做如下的事情:
1 | df1[rowSums(((df1 == df2) | (is.na(df1) & is.na(df2))), na.rm = T) == ncol(df1),] |
。
但我认为Akrun的方式更优雅,在速度方面可能表现更好。
另一个
1 2 3 4 | dt1 %>% semi_join(dt2, by = colnames(.)) X Y Z T 1 1 2 4 2 2 7 5 NA 3 |
。
数据
1 2 3 4 5 6 7 8 9 10 11 | dt1 <- read.table(text ="X Y Z T 1 2 4 2 3 2 1 4 7 5 NA 3", header = TRUE, stringsAsFactors = FALSE) dt2 <- read.table(text =" X Y Z T 1 2 4 2 3 2 NA 4 7 5 NA 3", header = TRUE, stringsAsFactors = FALSE) |