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

时间:2017-05-04 15:00:11

标签: 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列。

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

我想我们需要一个可以在循环内动态工作的粘贴,但我还没有到达那里。请帮忙。以下代码获取两列的交集。

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

1 个答案:

答案 0 :(得分:1)

如果这是一个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计算每个列表元素的长度。

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

数据

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
))