给定以下data.frame:
t x y
---------
1 1 3
1 1 3
1 1 2
2 1 2
2 2 2
我想要表格的输出
t cnt cux cuy
---------------
1 3 1 2
2 2 2 1
其中 cnt 是具有特定值 t 的所有行的计数,cux/cuy 是 x/y 的所有唯一行的计数
另一个约束是答案必须适用于可变数量的列。
谢谢。
您用文字描述的内容与您在预期输出中显示的内容不一致。特别是,y
根据您的输入计算 的唯一值将是 2 和 1,而不是 3 和 2。与书面描述一起使用:
DF <- data.frame(t=c(1,1,1,2,2), x=c(1,1,1,1,2), y=c(3,3,2,2,2))
library("plyr")
ddply(DF, .(t), function(DF) {
data.frame(cnt=length(DF$t), colwise(function(x) {length(unique(x))})(DF))
})
或者,如果您想要一些真正实用的东西:
library("functional")
ddply(DF, .(t), function(DF) {
data.frame(cnt=length(DF$t), colwise(Compose(unique, length))(DF))
})
或者完全使用功能范式:
merge(ddply(DF, .(t), summarise, cnt=length(t)),
ddply(DF, .(t), colwise(Compose(unique, length))))
这些都没有给出您要求的列名;而cux
不是x
. 但是,之后可以更改它们。
res <-
merge(ddply(DF, .(t), summarise, cnt=length(t)),
ddply(DF, .(t), colwise(Compose(unique, length))))
names(res)[-(1:2)] <- paste("cu", names(DF)[-1], sep="")
这使
> res
t cnt cux cuy
1 1 3 1 2
2 2 2 2 1