说我有这个data.frame集团data.frame由多列
data <- data.frame(foo = c(1, 1, 2, 2),
bar = c(10,10,10,20),
baz = c(1, 2, 3, 4),
qux = c(5, 6, 7, 8))
我想这组由foo
和bar
列在这个到达:
expected <- list(
data.frame(foo = c(1, 1),
bar = c(10, 10),
baz = c(1, 2),
qux = c(5, 6)),
data.frame(foo = 2,
bar = 10,
baz = 3,
qux = 7),
data.frame(foo = 2,
bar = 20,
baz = 4,
qux = 8)
)
我可以生成每组有一行,但我找不到MATCH
函数;当给定具有列foo,bar,baz,qux
的输入帧和具有列foo,bar
的过滤器帧时,返回foo,bar
单元格的内容匹配的行。
groups <- unique(data[c("foo","bar")])
MATCH(data, groups[1,]) == expected[[1]]
MATCH(data, groups[2,]) == expected[[2]]
MATCH(data, groups[3,]) == expected[[3]]
或者更高的水平GROUP
函数,它只是返回帧,一个列表,其中列给出的匹配:
GROUP(data, by=c("foo","bar")) == expected
我来到那个最接近的是
out <- aggregate(. ~ foo + bar, data, list)
凡单元格baz
,qux
是列表:
> out
foo bar baz qux
1 1 10 1, 2 5, 6
2 2 10 3 7
3 2 20 4 8
> class(out[,"baz"])
[1] "list"
因此,每个组都是out
中的一行,但是如何再次展开此操作,以便out[1,]
成为两行的数据帧,如expected[[1]]
?
沿着相同的路线另一个选择是'拆分(数据,粘贴(数据$ foo,数据$ bar))' – eddi
@eddi,当然。我只是按照设计/记录的方式使用'split',在分割多个因素时提供了一个分组因子列表。 'paste'解决方案不需要使用'drop'。你看到'paste'优于'interaction'(这是'split'默认使用的)的优点吗?我似乎记得在SO上看到了一个答案,其中'paste'比'interaction'快得多,但现在找不到它。 – A5C1D2H2I1M1N2O1R2T1
afaik'interaction'只是增加了很多额外的东西(然后最终做了'paste'),这对于这种特殊情况来说并不需要 – eddi