2012-09-11 75 views
2

我正在使用R,我想創建顯示序列或列的列,同時按兩個因子(hhid和句點)進行分組。如何在R中分組時創建列的列

例如,我有這樣的數據集:

hhid perid 
1000 1  
1000 1 
1000 1 
1000 2 
1000 2 
2000 1 
2000 1 
2000 1 
2000 1 
2000 2 
2000 2 

我想添加一個名爲 「爲Actno」 像這樣的列:

hhid perid actno 
1000 1  1 
1000 1  2 
1000 1  3 
1000 2  1 
1000 2  2 
2000 1  1 
2000 1  2 
2000 1  3 
2000 1  4 
2000 2  1 
2000 2  2 

回答

3

不需要plyr。只需使用aveseq

> dat$actno <- with(dat, ave(hhid, hhid, perid, FUN=seq)) 
> dat 
    hhid perid actno 
1 1000  1  1 
2 1000  1  2 
3 1000  1  3 
4 1000  2  1 
5 1000  2  2 
6 2000  1  1 
7 2000  1  2 
8 2000  1  3 
9 2000  1  4 
10 2000  2  1 
11 2000  2  2 

在這種情況下,第一個參數可以是其中任何一列或者你可以用略少優雅BU或許更清楚這樣做:

dat$actno <- with(dat, ave(hhid, hhid, perid, FUN=function(x) seq(length(x)))) 
1

plyr包可以很好地做到這一點:

library(plyr) 
dat <- structure(list(hhid = c(1000L, 1000L, 1000L, 1000L, 1000L, 2000L, 
2000L, 2000L, 2000L, 2000L, 2000L), perid = c(1L, 1L, 1L, 2L, 
2L, 1L, 1L, 1L, 1L, 2L, 2L)), .Names = c("hhid", "perid"), class = "data.frame", row.names = c(NA, 
-11L)) 

ddply(dat, .(hhid, perid), transform, actno=seq_along(perid)) 

    hhid perid actno 
1 1000  1  1 
2 1000  1  2 
3 1000  1  3 
4 1000  2  1 
5 1000  2  2 
6 2000  1  1 
7 2000  1  2 
8 2000  1  3 
9 2000  1  4 
10 2000  2  1 
11 2000  2  2 
+0

非常感謝Justin ...它可以處理我的數據集,但是由於組數很大,運行代碼後花了很長時間,我的電腦顯着減慢了速度。你有什麼建議嗎? – POTENZA

+0

@ user1663986「plyr」是探索數據的好方法,只要它很小。其他答案中的任何一個,尤其是迪文的答案都會非常快,並且在大數據上運行良好。 – Justin

+0

@ user1663986你是怎麼回答mnel的答案的? –

2

如果您的數據被調用urdat然後沒有plyr喲你可以這樣做:

df <- urdat[order(urdat$hhid, urdat$perid),] 
df$actno <- sequence(rle(df$perid)$lengths) 
4

如果你有大量的團體或大數據,data.table是去的時間效率和內存的方式

# assuming your data is in a data.frame called DF 
library(data.table) 
DT <- data.table(DF) 


DT[, ActNo := seq_len(.N), by = list(hhid,perid)] 

注意.N給出了子行通過分組編號(見?data.table瞭解詳細信息)

+0

有沒有一種快速的方法來處理data.table中的關係? – gannawag

-4

僞代碼:

For each unique value of `hhid` `h` 
    For each unique value of `perid` `p` 
     counter = 0; 
     For each row of table where `hhid==h && perid==p` 
      counter++; 
      Assign counter to `actno` of this column 

應該是微不足道的實施,特別是一個data frame