0

次の 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のすべての一意の行の数です。

もう 1 つの制約は、可変数の列に対して答えが機能する必要があるということです。

ありがとう。

4

1 に答える 1

2

言葉で説明することと、期待される出力で示すことは一致しません。特に、一意の値をカウントyすると、入力に基づいて 3 と 2 ではなく、2 と 1 になります。書かれた説明に行く:

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
于 2011-09-28T18:47:49.270 に答える