我是R的新生,我一直在搜索并尝试大约一个星期,与该任务进行了角力。我需要创建一个新变量,该变量随给定变量的每个唯一值递增1-在这种情况下,无论如何都可以使用'spec'或'speccode'。由于我的物种数据集太大,我创建了一个测试数据集来展示我的问题:
dat<-as.Date(c("1-5-2012", "1-5-2012", "1-6-2012", "1-7-2012", "1-9-2012",
"1-9-2012", "1-9-2012", "1-10-2012", "1-10-2012", "1-1-2013"), "%d-%m-%Y")
spec<-c("Ae. gen", "Ae. gen", "cpk", "Cul ann", "Anoph", "Anoph", "cpk", "Anoph", "Cul ann", "Ae. gen")
speccode<-c(1, 1, 4, 5, 3, 3, 4, 3, 5, 1)
test.df<-data.frame(dat, spec, speccode)
test.df
我想添加一个新变量“ specrec”,该变量连续地对每个唯一值进行计数,并且在该值不同于之前的每个值的情况下仅加1。像这样:
dat spec speccode specrec
1 2012-05-01 Ae. gen 1 1
2 2012-05-01 Ae. gen 1 1
3 2012-06-01 cpk 4 2
4 2012-07-01 Cul ann 5 3
5 2012-09-01 Anoph 3 4
6 2012-09-01 Anoph 3 4
7 2012-09-01 cpk 4 4
8 2012-10-01 Anoph 3 4
9 2012-10-01 Cul ann 5 4
10 2013-01-01 Ae. gen 1 4
我能编码的最好的近似值是
r = rle(test.df$speccode)
test.df$specrec<-rep(seq_along(r$lengths), r$lengths)
test.df
但是每次值更改时都会计数,无论是否唯一,它都是独立的。
我需要这个新变量来创建物种发现曲线。我知道素食包和相应的功能。但是,我都无法使用来自几乎类似数量的“站点”的超过21.000个观测值的数据集。
我们非常感谢所有帮助,非常感谢!
答案 0 :(得分:0)
可以使用cumsum
在“规范代码”上使用duplicated
创建的逻辑向量来完成
library(dplyr)
test.df %>%
mutate(specrec = cumsum(!duplicated(speccode)))
# dat spec speccode specrec
#1 2012-05-01 Ae. gen 1 1
#2 2012-05-01 Ae. gen 1 1
#3 2012-06-01 cpk 4 2
#4 2012-07-01 Cul ann 5 3
#5 2012-09-01 Anoph 3 4
#6 2012-09-01 Anoph 3 4
#7 2012-09-01 cpk 4 4
#8 2012-10-01 Anoph 3 4
#9 2012-10-01 Cul ann 5 4
#10 2013-01-01 Ae. gen 1 4
或者base R
test.df$specrec <- cumsum(!duplicated(test.df$speccode))
函数rle
检查相邻元素是否相同并且不在整列上