我有一个相对较大的数据集(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)相同,但每个站点的站点数量不同.
下面是一个使用略显笨拙的解决方案plyr和ddply:
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,sequence和rle功能,但我的大脑是目前几分朦胧.如果你让这个开放一点,有人可能会带来一个光滑的非plyr解决方案.