我想在数据帧的列上执行操作,其中输出取决于两个值之间的比较。
我的数据框dat
的排列方式如下:
region value1
a 0
a 0
a 6
a 7
a 3
a 0
a 4
b 5
b 1
b 0
我想创建一个基于整数的因子值向量。每当区域值发生变化或每次value1
为0时,因子值都应递增。因此,在这种情况下,我想要的向量将等同于c(1, 2, 2, 2, 2, 3, 3, 4, 4, 5)
。
我有代码可以使因子向量仅在value1
为0时递增:
fac <- as.factor(cumsum(dat[,2]==0))
我有c风格的代码,它大致我想要的矢量,但在我的整体数据上运行速度非常慢,简直太丑了:
p <- 1
facint <- 1
for (i in 2:length(dat[,2])) {
facint <- c(facint, p)
if (dat[i, 2]==0 || dat[i, 1] != dat[i-1, 1])
p = p+1
}
fac <- as.factor(facint)
那么在R风格编程的每一行上操作时如何完成这样的操作呢?
答案 0 :(得分:1)
尝试
cumsum(dat[,2]==0|c(FALSE,dat$region[-1]!=dat$region[-nrow(dat)]))
# [1] 1 2 2 2 2 3 3 4 4 5
或者
cumsum(!duplicated(dat[,1]) | dat[,2]==0)
#[1] 1 2 2 2 2 3 3 4 4 5