2013-07-12 2 views
1

Предположим, у меня есть два Фреймы данных:Уникальные и неединственные списки значений в кадре данных в R

данных кадра 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

вы ищете ?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

Вы можете использовать выражение %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,] 

и сэкономить несколько строк кода.

Смежные вопросы