2014-09-03 79 views
0

我想採取data.frame其中一些列是因子,通過因子分組以複雜的方式對其進行彙總,然後將結果組裝成新的總結data.frame.這一直是人們一直都在做的事情,但我似乎無法做到。這是我想要做的這種事情的一個簡單的例子:如何將「by」數據結構轉換爲具有因子的數據框架

> df 
    direction distance 
1  south 83.40364 
2  east 38.45644 
3  west 92.29418 
4  east 87.81878 
5  north 99.62949 
6  west 10.65441 
7  south 58.06977 
8  north 79.34895 
> bydir <- by(df,df$direction,function(x) { 
    list(dir=x$direction[1], dist=sum(x$distance))}) 
> dirs <- data.frame() 
> for (i in bydir) {dirs <- rbind(dirs, i)} 
Warning messages: 
1: In `[<-.factor`(`*tmp*`, ri, value = "north") : 
    invalid factor level, NA generated 
2: In `[<-.factor`(`*tmp*`, ri, value = "south") : 
    invalid factor level, NA generated 
3: In `[<-.factor`(`*tmp*`, ri, value = "west") : 
    invalid factor level, NA generated 
> dirs 
    dir  dist 
2 east 126.2752 
21 <NA> 178.9784 
3 <NA> 141.4734 
4 <NA> 102.9486 

我看了plyr了一下,我打賭我能得到它爲我工作,但我的真正的問題是,爲什麼不能R接受不是有效等級的dir因子的新值,並且簡單地爲該因子添加等級,因爲我一次只構建一個數據框架?即使將因子轉換爲character並將stringsAsFactors = FALSE設置爲rbind也不會阻止R試圖使該列成爲因子並生成NA。我想要一個解決方案,但更重要的是,我想了解R在這裏做什麼。

感謝,

格倫

附:我在這裏發現了一些有趣的方向:http://lamages.blogspot.com/2012/01/say-it-in-r-with-by-apply-and-friends.html,但我還沒有得到任何一個爲我的案件工作。

回答

2

問題是你的循環。你不能輕鬆地綁定到沒有列的空數據框。幸運的是,這完全可以避免。

bydir <- by(df,df$direction,function(x) { 
    list(dir=x$direction[1], dist=sum(x$distance))}) 
do.call(rbind.data.frame, bydir) 

更好。它甚至會更好,返回一個data.frame而不是一個泛型列表

bydir <- by(df,df$direction,function(x) { 
    data.frame(dir=x$direction[1], dist=sum(x$distance))}) 
do.call(rbind, bydir) 
當然

by()是矯枉過正這個特殊的例子。一個簡單的aggregate會做

aggregate(distance~direction, df, sum) 

但我假設你的真實情況是更復雜的。

相關問題