返回连续值满足条件的行

时间:2019-01-10 15:49:43

标签: r dataframe

我有以下数据框df。我想返回一个向量result,该向量指示哪些行满足以下条件:该行中至少有2个连续值小于-1.7。

set.seed(123)

df <- data.frame(V1=rnorm(10,-1.5,.5),
                 V2=rnorm(10,-1.5,.5),
                 V3=rnorm(10,-1.5,.5),
                 V4=rnorm(10,-1.5,.5),
                 V5=rnorm(10,-1.5,.5),
                 V6=rnorm(10,-1.5,.5),
                 V7=rnorm(10,-1.5,.5),
                 V8=rnorm(10,-1.5,.5),
                 V9=rnorm(10,-1.5,.5),
                 V10=rnorm(10,-1.5,.5))
rownames(df) <- c(seq(1976,1985,1))

结果将是一个向量:

result <- c(1977,1979,1980,1982,1983,1985)

3 个答案:

答案 0 :(得分:3)

一种选择是用apply遍历行,用rle创建逻辑条件,检查是否有anylengths大于1的TRUE元素,提取names

names(which(apply(df, 1, function(x) with(rle(x < - 1.7), any(lengths[values] > 1)))))
#[1] "1977" "1979" "1980" "1982" "1983" "1985"

或者更好的方法是通过放置两个逻辑矩阵对其向量化(即删除数据集的第一列,检查它是否小于-1.7,类似地删除最后一列并执行相同操作),{{1} }通过检查相应元素是否为Reduce,将其转换为单个逻辑matrix,得到TRUE,如果该值大于0,则提取行名

rowSums

答案 1 :(得分:3)

结合使用whicharr.ind = TRUE的有趣选项

temp <- which(df < -1.7, arr.ind = TRUE)
rownames(df)[aggregate(col~row, temp, function(x) any(diff(x) == 1))[, 2]]

#[1] "1977" "1979" "1980" "1982" "1983" "1985"

我们首先获取所有小于-1.7的行和列位置。使用aggregate,我们将每个col分组为row,并检查一行中是否至少有一个连续的值,以及返回TRUE子集的rownames的值

答案 2 :(得分:2)

一种使用滞后和来获取向量中每对数字之和的解决方案。如果滞后总和为2,则表示该行中至少有2个连续值满足条件。

rownames(df)[apply(df < -1.7, 1, function(x) any(x[-nrow(df)] + x[-1] == 2))]

# [1] "1977" "1979" "1980" "1982" "1983" "1985"