r - 获取存在条件的行

标签 r dataframe

如何获取具有两个连续负值的数据框的行号?

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/

相关文章:

r - 对 geom_line 和 x 轴之间的区域进行着色

python - 如何在 Spyder 窗口中获取大数据帧的最后一条记录?

r - 将多列合二为一的复杂数据框转换

python - 实现 cdc 但在 Python Pandas 中出现值错误

r - 如何在 R 中创建具有月份频率的 future 日期

r - 仅从脚本中获取单个变量

r - 查找数据框中是否存在列

r - 当对象在另一个包中定义时,如何在 R 中调用新函数?

r - 无法连接到 bioconductor 网站

r - 将一个数据帧中的单元格值与另一数据帧中的相应单元格值连接起来