2013-01-04 57 views
2

我正在處理一組包含反人口販運組織信息的數據集。這些組織由組織名稱或組織主頁的網址來標識。我想根據具體情況有條件地摺疊此數據框,以便留下唯一的標識符集(對於我的數據,無論是組織的名稱還是組織的網址)對於每種情況以及這些情況下的大約1000+個數字屬性,這些數字屬性是標識符在摺疊之前與之關聯的無數行的最高或最低值。爲了舉例說明這一點,我想轉:在R中摺疊數據案例

> df1 
x  y  z 
Item1 0  3 
Item1 1  4 
Item2 1  2 
Item3 1  3 
Item2 1  5 
Item3 1  2 
Item4 0  2 

成類似

> df2 
x  y  z 
Item1 1  3 
Item2 1  2 
Item3 1  2 
Item4 0  2 

在這個例子中,當然,我想保持最大的VAR2和最小的VAR3和只保留獨特Var1值。

任何人都可以提出一個系統的方式來做到這一點大數據集?在此先感謝您的幫助!

回答

6

一種選擇是使用plyr包:

library(plyr) 
ddply(df, .(x), summarize, y=max(y), z=min(z)) 
     x y z 
1 Item1 1 3 
2 Item2 1 2 
3 Item3 1 2 
4 Item4 0 2 

另外,和幾乎一樣簡單,是包data.table。如果您的數據非常大,此選項可能會大大加快。

library(data.table) 
data.table(df)[, list(y=max(y), z=min(z)), by=x] 
     x y z 
1: Item1 1 3 
2: Item2 1 2 
3: Item3 1 2 
4: Item4 0 2 
+0

這非常有幫助!然而,我有一個(可能是愚蠢的)問題 - 因爲R傾向於用矢量來「思考」,data.table技術在保存數據的情況或行方面有多可靠。讓我知道這是否需要澄清。 – Nina

2
library(plyr) 
V1 <- sample(10, 100, replace=TRUE) 
V2 <- sample(100, 100, replace=TRUE) 
V3 <- sample(100, 100, replace=TRUE) 

df <- data.frame(V1=V1, V2=V2, V3=V3) 

ddply(df, "V1", function(x) c(max(x$V2), min(x$V3))) 
3

我想你也許應該選擇Andrie的,因爲他給你的data.table的做法,是值得商榷的清潔,當然更快,但「經典」的方法來分類中處理不同的結果是使用lapply(split(...))

> do.call(rbind, lapply(split(df1, df1$x) , function (d) data.frame(x=d$x[1], 
                  mx.y=max(d$y), mn.z=min(d$z) 
      ))) 

      x mx.y mn.z 
Item1 Item1 1 3 
Item2 Item2 1 2 
Item3 Item3 1 2 
Item4 Item4 0 2 
2

由於yz代表的行數,從而本質上是積極的,你可以使用這個簡單的方法:

aggregate(cbind(y, -z) ~ x, df1, function(x) abs(max(x))) 

     x y -z 
1 Item1 1 3 
2 Item2 1 2 
3 Item3 1 2 
4 Item4 0 2