2011-09-28 65 views
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

我沒有downvote要麼,但肯定這樣想過,因爲例如不能提供的輸出相協調。 –

+0

@Dwin:固定;對不起 – hoffmanc

回答

2

您用文字描述的內容和您在預期輸出中顯示的內容不一致。特別是,根據您的輸入,計算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 
+0

真棒!感謝您的解釋。我會寫更好的問題寫作:) – hoffmanc

相關問題