R中数据框中唯一且非唯一的值列表

时间:2013-07-12 21:54:42

标签: r dataframe

假设我有两个数据框:

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

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

Data1的代码:

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" 

Data2的代码:

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

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

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

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

2 个答案:

答案 0 :(得分: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"

答案 1 :(得分: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,]

并保存一些代码行。