1

假设我有两个数据框:

数据框 1(我们称之为 Data1):

V1     V2     
1     "AB"    
3     "XY"
5     "DH"
8     "ST"
7     "RE"

数据1的代码:

V1 <- c(1,3,5,8,7)
V2 <- c("AB","XY", "DH", "ST","RE")
Data1 <- data.frame(V1,V2)

数据框 2(我们称之为 Data2):

V1     V2     
1     "AB"    
2     "ZZ"
3     "XY"
5     "DH"
8     "ST" 

数据2的代码:

V1 <- c(1,2,3,5,8)
V2 <- c("AB","ZZ","XY","DH","ST")
Data2 <- data.frame(V1,V2)

如果您注意到,Data1 中不存在 Data2 的第二行(其中 V2 的值为“ZZ”),并且 Data1 中的最后一行(其中 V2 的值为“RE”)不存在于 Data2 中。

A)我想列出任何一个数据框中都不存在的所有 V2 值。
对于这个例子,这将是“ZZ”和“RE”。

B)我想列出两个数据帧中都存在的所有 V2 值。
对于此示例,结果将是“AB”、“XY”、“DH”、“ST”。

4

2 回答 2

2

你正在寻找?setdiff?intersect

inters <- intersect(DF2$V2, DF1$V2)
[1] "AB" "XY" "DH" "ST"

setdf <- c(setdiff(DF2$V2, DF1$V2), setdiff(DF1$V2, DF2$V2))
[1] "ZZ" "RE"
于 2013-07-12T22:14:44.433 回答
1

您可以使用该%in%表达式来查找两个数据帧中是否V2存在 的值。使用 not 表达式 ( !) 查找两个数据帧中都不存在的那些,然后将这两个数据帧的结果绑定在一起。

> rbind(Data1[!Data1$V2 %in% Data2$V2,], Data2[!Data2$V2 %in% Data1$V2,])
  V1 V2
5  7 RE
2  2 ZZ
> unique(rbind(Data1[Data1$V2 %in% Data2$V2,], Data2[Data2$V2 %in% Data1$V2,]))
  V1 V2
1  1 AB
2  3 XY
3  5 DH
4  8 ST

在最后一块:如果每个 V1,V2 组合都相同,你可以简单地写

Data1[Data1$V2 %in% Data2$V2,]

并为自己节省几行代码。

于 2013-07-12T22:06:29.663 回答