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
# give the entry in A for in which A$a matches B$b
A[,`:=`(res=unlist(sapply(list(a),function(x,y){
x %in% unlist(lapply(y,as.vector,mode="character"))
},list(B[,b]),simplify=FALSE)))
][res==TRUE
][,res:=NULL][]
# get T/F for each index of A
A[,sapply(list(a),function(x,y){
x %in% unlist(lapply(y,as.vector,mode="character"))
},list(B[,b]),simplify=FALSE)]
7条答案
按热度按时间xv8emn3q1#
以下是一些基本的尝试:
类似地,你可以简单地得到计数:
ffdz8vbo2#
我通常处理大型集合,所以我使用表格而不是维恩图:
zbq4xfa03#
还有一种方法,使用 %in% 和公共元素的布尔向量,而不是 intersect 和 setdiff。我认为你实际上是想比较两个 * vector *,而不是两个 * list * -一个 list 是一个R类,它可以包含任何类型的元素,而vector总是只包含一种类型的元素,因此更容易比较什么是真正相等的。在这里,元素被转换为字符串,因为这是目前最不灵活的元素类型。
正如前面提到的,在R中绘制维恩图有多种选择。下面是使用gplots的输出。
vsmadaxz4#
使用sqldf:较慢,但非常适合混合类型的 Dataframe :
wribegjk5#
使用与上述答案之一相同的示例数据。
match
函数返回一个向量,其中包含A
中所有值在B
中的位置。因此,cat
,A
中的第二个元素,是B
中的第三个元素。没有其他匹配。要获取
A
和B
中的匹配值,可以执行以下操作:要获取
A
和B
中的非匹配值,请执行以下操作:此外,您可以使用
length()
来获取匹配和不匹配值的总数。xkftehaa6#
如果
A
是一个数据表,其字段a
为列表类型,其条目本身为原始类型的向量,例如创建如下并且
B
是具有基元条目的向量的列表,例如创建如下并且试图查找
A$a
中的哪个元素(如果有的话)与B
匹配如果你只需要
a
中的条目如果你想要
a
的匹配索引如果B本身是一个与A具有相同结构的数据表,例如
你要找的是两个列表的一列交集,这里你需要相同顺序的向量元素。
请注意,您不能像
因为你不能在数据中键入
list
类型的字段。表1.12.2同样,你不能问
即使A和B相同,因为
==
运算符尚未在R中为list
类型实现xqkwcwgp7#
您可以在r控制台中输入
help(sets)
,以查看使用base r命令的不同set操作的文档:并集、交集、(不对称!)两个向量上的差异、相等和隶属关系。文档中的示例: