比较R中的两个列表

我有两个ID列表。

我想比较这两个名单,特别是我对以下数字感兴趣:

  • 列表A和B中有多less个ID
  • A中有多less个ID,而B中没有
  • B中有多less个ID,但A中没有

我也喜欢画一个维恩图。

这里有一些基本的尝试:

 > A = c("Dog", "Cat", "Mouse") > B = c("Tiger","Lion","Cat") > A %in% B [1] FALSE TRUE FALSE > intersect(A,B) [1] "Cat" > setdiff(A,B) [1] "Dog" "Mouse" > setdiff(B,A) [1] "Tiger" "Lion" 

同样,你可以简单地得到计数:

 > length(intersect(A,B)) [1] 1 > length(setdiff(A,B)) [1] 2 > length(setdiff(B,A)) [1] 2 

我通常处理的是大集合,所以我使用了一个表格而不是维恩图表:

 xtab_set <- function(A,B){ both <- union(A,B) inA <- both %in% A inB <- both %in% B return(table(inA,inB)) } set.seed(1) A <- sample(letters[1:20],10,replace=TRUE) B <- sample(letters[1:20],10,replace=TRUE) xtab_set(A,B) # inB # inA FALSE TRUE # FALSE 0 5 # TRUE 6 3 

另一种方法是使用常量元素的布尔向量来代替intersectsetdiff 。 我认为你实际上想要比较两个向量 ,而不是两个列表 – 一个列表是一个R类,可能包含任何types的元素,而向量总是包含一个types的元素,因此比较容易比较真正的相等。 这里的元素被转换为string,因为这是当前最不灵活的元素types。

 first <- c(1:3, letters[1:6], "foo", "bar") second <- c(2:4, letters[5:8], "bar", "asd") both <- first[first %in% second] # in both, same as call: intersect(first, second) onlyfirst <- first[!first %in% second] # only in 'first', same as: setdiff(first, second) onlysecond <- second[!second %in% first] # only in 'second', same as: setdiff(second, first) length(both) length(onlyfirst) length(onlysecond) #> both #[1] "2" "3" "e" "f" "bar" #> onlyfirst #[1] "1" "a" "b" "c" "d" "foo" #> onlysecond #[1] "4" "g" "h" "asd" #> length(both) #[1] 5 #> length(onlyfirst) #[1] 6 #> length(onlysecond) #[1] 4 # If you don't have the 'gplots' package, type: install.packages("gplots") require("gplots") venn(list(first.vector = first, second.vector = second)) 

就像提到的那样,在R中绘制维恩图有多种select。这里是使用gplots的输出。

与gplots的维恩图

使用sqldf:较慢但非常适合混合types的dataframe:

 t1 <- as.data.frame(1:10) t2 <- as.data.frame(5:15) sqldf1 <- sqldf('SELECT * FROM t1 EXCEPT SELECT * FROM t2') # subset from t1 not in t2 sqldf2 <- sqldf('SELECT * FROM t2 EXCEPT SELECT * FROM t1') # subset from t2 not in t1 sqldf3 <- sqldf('SELECT * FROM t1 UNION SELECT * FROM t2') # UNION t1 and t2 sqldf1 X1_10 1 2 3 4 sqldf2 X5_15 11 12 13 14 15 sqldf3 X1_10 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 
Interesting Posts