[R]

时间:2018-10-19 15:32:21

标签: r unique

我是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个观测值的数据集。

我们非常感谢所有帮助,非常感谢!

1 个答案:

答案 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检查相邻元素是否相同并且不在整列上