在R中动态地将参数传递给intersect/reduce函数

在R中动态地将参数传递给intersect/reduce函数,r,dataframe,R,Dataframe,我有一个数据框,它有几个数字列。我想创建一个循环,通过以下方式查找数据帧的公共元素的长度。假设df是我的数据帧 > df [,1] [,2] [,3] [,4] 1 4 5 7 2 1 4 8 12 4 6 1 4 12 1 9 我的结果向量的最后一个元素应该在df的所有列中具有公共元素的长度。最后的第二个元素应排除最后一列,并将公共元素的长度从第1列取到第n-1列 在这种情况下,我的结果向量应该是

我有一个数据框,它有几个数字列。我想创建一个循环,通过以下方式查找数据帧的公共元素的长度。假设df是我的数据帧

 > df
  [,1] [,2] [,3] [,4]
  1    4    5    7
  2    1    4    8
  12   4    6    1
  4   12    1    9
我的结果向量的最后一个元素应该在df的所有列中具有公共元素的长度。最后的第二个元素应排除最后一列,并将公共元素的长度从第1列取到第n-1列

在这种情况下,我的结果向量应该是c3,2,1 结果的第一个元素有3,因为1、12和4在第1列和第2列中很常见 第二个元素有2个,因为1和4在第1列、第2列和第3列中是公共的 第三个元素有1,因为1在所有列中都是公共的。 请假设我有多个这样的列和行

我想我们需要一个可以在循环中动态工作的粘贴,但我还没能实现。请帮忙。下面的代码获取两列的交点

 length(Reduce(intersect,  list(as.matrix(df[1]),as.matrix(df[2]))))                       

如果这是一个data.frame,那么代码就非常接近了

Reduce(intersect, df, accumulate=TRUE)
[[1]]
[1]  1  2 12  4

[[2]]
[1]  1 12  4

[[3]]
[1] 1 4

[[4]]
[1] 1
然后删除第一列的第一个元素,并使用长度计算每个列表元素的长度

lengths(Reduce(intersect, df, accumulate=TRUE)[-1])
[1] 3 2 1
资料


df对象是一个矩阵,而不是data.frame。您可以通过列输出来判断。因此,df[1]将返回矩阵1中的第一个元素,df[2]将返回第二个元素2。使用Reduce的选项很棒
df <- 
structure(list(V1 = c(1L, 2L, 12L, 4L), V2 = c(4L, 1L, 4L, 12L
), V3 = c(5L, 4L, 6L, 1L), V4 = c(7L, 8L, 1L, 9L)), .Names = c("V1", 
"V2", "V3", "V4"), class = "data.frame", row.names = c(NA, -4L
))