如何根据R中其他列中的值添加计数列

djh*_*ing 5 r sequence

我有一个相对较大的数据集(16,000 + x~31).换句话说,它足够大,我不想在Excel中逐行操作它.数据采用以下形式:

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
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,站点计数是连续的,但我想要一个列,其中站点编号与每个块重置.例如,我想要下面这样的东西:

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
Run Code Online (Sandbox Code Playgroud)

我正在考虑使用R函数但是不确定它是否会因为日常的并发症而起作用.否则,我会尝试这样的事情:

Data$site2 <- sequence(rle(Data$block)$lengths)
Run Code Online (Sandbox Code Playgroud)

有没有人有任何建议添加列计数(序列)每个块内的网站数量?如果有帮助,则每个站点记录的天数(263)相同,但每个站点的站点数量不同.

jor*_*ran 6

下面是一个使用略显笨拙的解决方案plyrddply:

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

或略微光滑的版本:

ddply(df,.(block),transform,site1 = as.integer(as.factor(site)))
Run Code Online (Sandbox Code Playgroud)

有可能是直接这样做,但是,使用各种的一个聪明的办法seq,sequencerle功能,但我的大脑是目前几分朦胧.如果你让这个开放一点,有人可能会带来一个光滑的非plyr解决方案.