seleccionar - tablas en r
Compare dos listas en R (5)
Aquí hay algunos conceptos básicos para probar:
> 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"
Del mismo modo, puedes obtener conteos simplemente como:
> length(intersect(A,B))
[1] 1
> length(setdiff(A,B))
[1] 2
> length(setdiff(B,A))
[1] 2
Tengo dos listas de ID.
Me gustaría comparar las dos listas, en particular, estoy interesado en las siguientes figuras:
- Cuántas identificaciones están ambas en la lista A y B
- Cuántas identificaciones hay en A pero no en B
- Cuántas identificaciones hay en B pero no en A
También me gustaría dibujar un diagrama de Venn.
Con sqldf: Más lento pero muy adecuado para marcos de datos con tipos mixtos:
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
Por lo general, me ocupo de los sets de gran tamaño, así que utilizo una tabla en lugar de un diagrama de Venn:
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
Sin embargo, de otra manera, con el uso de % en% y vectores booleanos de elementos comunes en lugar de intersect y setdiff . Supongo que realmente quiere comparar dos vectores , no dos listas : una lista es una clase R que puede contener cualquier tipo de elemento, mientras que los vectores siempre contienen elementos de un solo tipo, por lo tanto, una comparación más sencilla de lo que es realmente igual. Aquí los elementos se transforman en cadenas de caracteres, ya que era el tipo de elemento más inflexible que estaba presente.
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))
Como se mencionó, hay múltiples opciones para trazar diagramas de Venn en R. Aquí está la salida usando gplots.
Usando los mismos datos de ejemplo que una de las respuestas anteriores.
A = c("Dog", "Cat", "Mouse")
B = c("Tiger","Lion","Cat")
match(A,B)
[1] NA 3 NA
La función de match
devuelve un vector con la ubicación en B
de todos los valores en A
Entonces, cat
, el segundo elemento en A
, es el tercer elemento en B
No hay otras coincidencias
Para obtener los valores coincidentes en A
y B
, puede hacer:
m <- match(A,B)
A[!is.na(m)]
"Cat"
B[m[!is.na(m)]]
"Cat"
Para obtener los valores que no coinciden en A
y B
:
A[is.na(m)]
"Dog" "Mouse"
B[which(is.na(m))]
"Tiger" "Cat"
Además, puede usar length()
para obtener el número total de valores coincidentes y no coincidentes.