我有一个包含多个数字列的数据框。我想创建一个循环,以下列方式查找数据框的公共元素的长度。让我们假设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]))))
答案 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
))