如何获取具有两个连续负值的数据框的行号?
df<-data.frame(val=c(.3,.1,-.1,-.2,.01,.2,-.9,-.7))
> df
val
1 0.30
2 0.10
3 -0.10
4 -0.20
5 0.01
6 0.20
7 -0.90
8 -0.70
目标:返回第 4 行和第 8 行
注意:如果一行中有超过 2 个负值,我希望返回第二个负值的行号。如果例如
val
1 -0.30 #added to show just one negative value should be ignored
2 0.10
3 -0.10
4 -0.20
5 0.01
6 0.20
7 -0.90
8 -0.70
9 -0.09 #added to show the case of more than 2 neg values
目标:仍然返回第 4 行和第 8 行
最佳答案
您可以尝试使用 rle
:
# get the sequences of negative / not negative values
rle_val <- rle(df$val < 0)
# get the ones that fulfill the condition, using cumsum to get the row numbers and not just the sequence order
cumsum(rle_val$lengths)[which(rle_val$value & rle_val$lengths==2)]
#[1] 4 8
编辑
如果你想找出第二个负值的索引,即使有超过 2 个连续的负值,你可以这样做
cumsum(rle_val$lengths)[which(rle_val$value & rle_val$lengths>=2)-1]+2
EDIT2
如果您在开始时有 2 个或更多负值,则以上内容将不起作用。为了避免这个问题,你可以这样做:
if(rle_val$value[1] & rle_val$lengths[1]>=2) {
c(2, cumsum(rle_val$lengths)[which(rle_val$value & rle_val$lengths>=2)[-1]-1]+2)
} else {
cumsum(rle_val$lengths)[which(rle_val$value & rle_val$lengths>=2)-1]+2
}
例子
df$val2 <- df$val
df$val2[5] <- -0.05
rle_val2 <- rle(df$val2 < 0)
if(rle_val2$value[1] & rle_val2$lengths[1]>=2) {
c(2, cumsum(rle_val2$lengths)[which(rle_val2$value & rle_val2$lengths>=2)[-1]-1]+2)
} else {
cumsum(rle_val2$lengths)[which(rle_val2$value & rle_val2$lengths>=2)-1]+2
}
#[1] 4 8
以 bgoldst 为例:
df <- data.frame(val=c(-0.4,-0.3,0.1,-0.1,-0.2,0.01,0.2,-0.9,-0.7,-0.09))
rle_val <- rle(df$val < 0)
if(rle_val$value[1] & rle_val$lengths[1]>=2) {
c(2, cumsum(rle_val$lengths)[which(rle_val$value & rle_val$lengths>=2)[-1]-1]+2)
} else {
cumsum(rle_val$lengths)[which(rle_val$value & rle_val$lengths>=2)-1]+2
}
#[1] 2 5 9
关于r - 获取存在条件的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37384163/