2011-12-18 89 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)))) 
相关问题