在A列中查找第一个大于0的值的位置,并返回该位置在B列中的对应值。

3
我刚接触 R 语言,在处理以下问题时遇到了困难:我想评估 A 列中的值,并获取该列中第一个非零值的位置。然后,我想在找到的位置获取 B 列中的值。这需要在一个类似于此表格的数据框中进行操作:
A 列 B 列
0 1998
0 1997
2 1996
3 1995
因此,输出应为:1996。
我尝试使用 match() 函数但没有成功。非常感谢您提前的帮助。
4个回答

5
如果您的A是非负的。
B[ match(FALSE, cummax(A) == 0) ]

4

现有的回答都很好。我想用一个整洁易读的 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 %>% filter('Column A'> 0)%>% '[['(1,'Column B')。;-) - Martin Gal

3
我们可以使用基本R函数,即with - 创建一个逻辑条件与'列A',子集中对应的元素'列B'中,逻辑条件为真,然后使用索引[1]返回第一个元素。
with(df1, `Column B`[`Column A` > 0][1])

如果列名存储在另一个对象中
obj1 <- 'Column A'
df1[["Column B"]][df1[[obj1]] > 0][1]

成功了!谢谢你!给像我这样的人参考一下,如果不指定[1],它会返回一个向量而不是第一个值。 - Diego

3

另一个基本的R选项

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

这提供了

[1] 1996

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接