2013-04-26 55 views
0

我從ddply函數中發現了一個有趣的功能。看來,你不能在彙總輸出數據幀使用相同的變量名不是在輸入數據幀:plyr彙總輸出和輸入數據幀中的變量名稱

set.seed(1) 
ex <- data.frame(Type = c(rep("a", 10), rep("b", 10)), time = rnorm(20, 6,3)) 
ddply(ex, .(Type), summarize, time = mean(time), n = length(time)) 

    Type  time n 
1 a 6.396608 1 
2 b 6.746535 1 

length出來爲1。然而,如果你改變變量名(時間)到別的東西:

ddply(ex, .(Type), summarize, tim = mean(time), n = length(time)) 
    Type  tim n 
1 a 6.396608 10 
2 b 6.746535 10 

它也幫助,如果我重新排列列的輸出:

ddply(ex, .(Type), summarize, n = length(time), time = mean(time)) 
    Type n time 
1 a 10 6.396608 
2 b 10 6.746535 

或重命名變量輸入:

set.seed(1) 
ex <- data.frame(Type = c(rep("a", 10), rep("b", 10)), tim = rnorm(20, 6,3)) 
ddply(ex, .(Type), summarize, time = mean(tim), n = length(tim)) 

    Type  time n 
1 a 6.396608 10 
2 b 6.746535 10 

但是:

ddply(ex, .(Type), summarize, tim = mean(tim), n = length(tim)) 

    Type  tim n 
1 a 6.396608 1 
2 b 6.746535 1 

我的工作:

R version 3.0.0 (2013-04-03) 
Platform: x86_64-w64-mingw32/x64 (64-bit) 
plyr_1.8 

這是plyr什麼已知特徵[R 3.0.0後發生了什麼?

回答

2

對於你的第一個例子,這可能是因爲微積分是按順序進行的。首先你計算時間=平均值(時間),因此計算時間長度爲一。因此,當你詢問長度(時間)時,你得到1,而如果你在創建對象時間之前詢問長度,你會得到你的預期結果,如你的第三和第五例所示。

+0

感謝您的回答。我認爲'ddply'會從輸入數據幀中獲取矢量。也許我錯了?如果函數會考慮輸出數據幀,那麼您的解釋將會起作用。 – Mikko 2013-04-26 14:08:22

+0

@我認爲垂涎的解釋是正確的,但感謝您指出這一點,我一直認爲它會使用輸入數據幀。 – mitchus 2013-07-31 08:28:19