2013-03-21 55 views
4

有沒有辦法將自定義名稱分配給ldply的結果中通常名爲.id的列?在ldply中重命名.id列

> ldply(setNames(1:3, 1:3), function(i) data.frame(j=1/i)) 
    .id   j 
1 1 1.0000000 
2 2 0.5000000 
3 3 0.3333333 

我知道我可以調用的結果rename,但我想這樣做的一個電話。有什麼建議麼?

注意,從類似的問題adply遭罪:

> adply(as.array(setNames(1:3, 1:3)), 1, function(i) data.frame(j=1/i)) 
    X1   j 
1 1 1.0000000 
2 2 0.5000000 
3 3 0.3333333 

另一個related question地址重命名「數據」列的問題,但答案還沒有提供針對.id列的解決方案。

+1

我不這麼認爲(但會很樂意是錯誤的);也許你可以編寫自己的包裝函數來做到這一點? – 2013-03-21 16:31:44

回答

3

你似乎很喜歡使用setNames,所以你可以將「j」和「newname」賦值移動到一個方便的包裝上。

setNames(ldply(setNames(1:3, 1:3), function(i) data.frame(1/i)) , c("newname", "j")) 
    newname   j 
1  1 1.0000000 
2  2 0.5000000 
3  3 0.3333333 
+1

是的,這個或其他一些包裝是我知道這樣做的唯一方法。這意味着OP正嘗試將一個元名稱分配給原始列表中的名稱列表,這違反了'ldply'函數的邏輯。甚至更容易(至少在眼睛上),只需要用'names(data_Frame)[1] < - 「newname」' – Dinre 2013-03-21 16:53:34

4

我有proposed一個implementation,讓我們來看看它使得它成爲正式plyr。基本上,一個新的參數.idname,允許指定的.id列的名稱,與一個選項,以通過使NULL完全放棄它:

> ldply(setNames(1:3, 1:3), function(i) data.frame(j=1/i), .idname='i') 
    i   j 
1 1 1.0000000 
2 2 0.5000000 
3 3 0.3333333 

。安裝使用

library(devtools) 
install_github('plyr', 'krlmlr', ref='140-142-id') 

編輯微調的版本:這是現在在plyr 1.8.1可在CRAN:

> ldply(setNames(nm=1:3), function(i) data.frame(j=1/i), .id='i') 
+0

這樣的一行來簡單地改變「.id」列名,我只是用'ldply '','.id'值從輸入「'list'」的'名稱'中拉出來。因此,如果列表是您希望在其後聚合的不同級別的數據列表(例如),請確保該列表具有名稱,例如'names(mylist)< - seq_along(mylist)'。如果輸入列表的名稱爲NULL,則由'.id'參數命名的列將不會顯示。 – Kalin 2015-04-04 01:17:24