【问题标题】:Find position of first value greater than 0 in column A and return value in that position in column B在 A 列中查找大于 0 的第一个值的位置,并在 B 列中的该位置返回值
【发布时间】:2021-10-19 18:06:43
【问题描述】:

我是 R 新手,我正在努力解决这个问题:我想评估 A 列中的值并获取该列中第一个非零值的位置。然后,我想在找到的位置但在 B 列中获取值。这需要在与此类似的数据框中发生。

Column A Column B
0 1998
0 1997
2 1996
3 1995

所以输出应该是:1996.

我尝试使用 match() 没有成功。提前谢谢你。

【问题讨论】:

    标签: r dataframe subset


    【解决方案1】:

    我们可以使用base R 函数,即with - 使用“A 列”创建一个逻辑条件,将逻辑条件为TRUE 的“B 列”的相应元素子集化,并使用索引[1] 返回第一个元素

    with(df1, `Column B`[`Column A` > 0][1])
    

    如果列名存储在另一个对象中

    obj1 <- 'Column A'
    df1[["Column B"]][df1[[obj1]] > 0][1]
    

    【讨论】:

    • 成功了!谢谢!仅供参考,以防像我这样的人正在阅读本文,如果您不指定 [1],它将返回一个向量,而不仅仅是第一个值。
    【解决方案2】:

    如果你的 A 是非负数

    B[ match(FALSE, cummax(A) == 0) ]
    

    【讨论】:

      【解决方案3】:

      现有的答案都很棒。只是想我会用一种可读性很强的 tidyverse 方法来解决这个问题:

      library(dplyr)
      
      dat %>%
          filter(`Column A` > 0) %>%
          slice(1) %>%
          pull(`Column B`)
      

      数据:

      dat <- tribble(
          ~`Column A`, ~`Column B`,
          0,         1998,
          0,         1997,
          2,         1996,
          3,         1995
      )
      

      【讨论】:

      • 可读性较差但较短:dat %&gt;% filter(Column A` > 0) %>% [[(1, "Column B")`。 ;-)
      【解决方案4】:

      另一个基本 R 选项

      with(
        df,
        ColumnB[which.min(ColumnA <= 0)]
      )
      

      给了

      [1] 1996
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多