2011-12-18 88 views
5

我有一個相對較大的數據集(16,000 + x〜31)。換句話說,它足夠大,我不想在Excel中逐行處理它。該數據是這種形式:如何根據R中其他列中的值添加計數列

block site  day X1 X2 
1  1  1 0.4 5.1 
1  1  2 0.8 1.1 
1  1  3 1.1 4.2 
1  2  1 ... ... 
1  2  2 
1  2  3 
2  3  1 
2  3  2 
2  3  3 
2  4  1 
2  4  2 
2  4  3 

正如你可以看到,網站數是連續的,但我想在網站數量與每塊重設一列。例如,我想這樣的事情如下:

block site  day X1 X2 site2 
1  1  1 0.4 5.1 1 
1  1  2 0.8 1.1 1 
1  1  3 1.1 4.2 1 
1  2  1 ... ... 2 
1  2  2    2 
1  2  3    2 
2  3  1    1 
2  3  2    1 
2  3  3    1 
2  4  1    2 
2  4  2    2 
2  4  3    2 

我想使用R函數RLE,但我不知道這是否會因爲與天併發症的工作。否則,我會嘗試這樣的:

Data$site2 <- sequence(rle(Data$block)$lengths) 

有沒有人有任何建議增加列計數(序列)每個塊內的網站數量?如果有幫助,每個站點的記錄天數(263)相同,但每個站點的站點數量不同。

回答

6

下面是使用plyrddply一個略顯笨拙的解決方案:

ddply(df,.(block),transform, 
        site1 = rep(1:length(unique(site)), 
          times = rle(site)$lengths)) 

或者稍微雨衣版本:

ddply(df,.(block),transform,site1 = as.integer(as.factor(site))) 

有可能是直接這樣做,但一個聰明的方式,使用各種seq,sequencerle功能,但我的大腦此刻有點朦朧。如果您將此開放一段時間,有人可能會出現一個光滑的非plyr解決方案。

+0

謝謝你,這完美地工作。我以前見過plyr,但從未使用它。 ddply是完美的,我實際上想要分解矩陣,在幾天內使用reshape(= wide),應用rle(site),然後嘗試重塑(= long)。我不知道這是否會奏效,但我認爲有大約1000個更簡單的方法可以做到這一點。我喜歡dpdply解決方案。再次感謝。 – djhocking 2011-12-18 16:25:03

+0

不錯的一個,只是嘗試了類似的問題ddply選項,第一次完美工作 – Ell 2013-06-12 09:10:26

1

使用tapply可以工作

# Make some fake data 
dat <- data.frame(block = rep(1:3, each = 4), site = rep(1:6, each = 2), val = rnorm(12)) 
# For each block reset the count 
dat$site2 <- unlist(tapply(dat$site, dat$block, function(x){x - min(x) + 1})) 
+0

這似乎並不適用於我的雜亂數據。我忘記了該網站並不完全連續,因爲某些網站的數據採集器失敗或失蹤。所以偶爾整個數據集中的站點編號都會跳過,但我需要的是一個變量,這樣我就可以循環執行循環函數中的索引,作爲我的分析的一部分。也許如果我嘗試你的建議,但有一些巧妙的功能添加到site2中的以前的值,而不是基於它的原始網站編號。 – djhocking 2011-12-18 16:00:35

0

通過AVE:

df1 <- structure(list(block = c(1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2), 
    site = c(1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4), day = c(1, 
    2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3)), .Names = c("block", "site", 
"day"), row.names = c("2", "3", "4", "5", "6", "7", "8", "9", 
"10", "11", "12", "13"), class = "data.frame") 

df1$site2 <- ave(df1$site,df1$block,FUN=function(x) match(x,sort(unique(x)))) 
相關問題