【问题标题】:Return rows where consecutive values meet criterion返回连续值符合条件的行
【发布时间】:2019-06-05 12:52:18
【问题描述】:

我有以下数据框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)

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    一种选择是循环使用apply 的行,使用rle 创建一个逻辑条件,检查是否有any TRUE 元素的lengths 大于1,提取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,同样删除最后一列并做同样的事情),Reduce它到单个逻辑matrix,通过检查对应的元素是否为TRUE,得到rowSums,如果值大于0,我们提取行名

    names(which(rowSums(Reduce(`&`, list(df[-ncol(df)] < -1.7, df[-1] < -1.7))) > 0))
    #[1] "1977" "1979" "1980" "1982" "1983" "1985"
    

    【讨论】:

    【解决方案2】:

    使用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"
    

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

    【讨论】:

      【解决方案3】:

      一种使用滞后和来获得向量中每对数字之和的解决方案。如果滞后总和为 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"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-29
        • 1970-01-01
        • 1970-01-01
        • 2022-11-15
        • 1970-01-01
        • 1970-01-01
        • 2021-07-23
        • 1970-01-01
        相关资源
        最近更新 更多