То, что вы описываете словами и то, что вы показываете в ожидаемом результате, не согласны.В частности, подсчет уникальных значений 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