【发布时间】:2021-10-19 18:06:43
【问题描述】:
我是 R 新手,我正在努力解决这个问题:我想评估 A 列中的值并获取该列中第一个非零值的位置。然后,我想在找到的位置但在 B 列中获取值。这需要在与此类似的数据框中发生。
| Column A | Column B |
|---|---|
| 0 | 1998 |
| 0 | 1997 |
| 2 | 1996 |
| 3 | 1995 |
所以输出应该是:1996.
我尝试使用 match() 没有成功。提前谢谢你。
【问题讨论】:
我是 R 新手,我正在努力解决这个问题:我想评估 A 列中的值并获取该列中第一个非零值的位置。然后,我想在找到的位置但在 B 列中获取值。这需要在与此类似的数据框中发生。
| Column A | Column B |
|---|---|
| 0 | 1998 |
| 0 | 1997 |
| 2 | 1996 |
| 3 | 1995 |
所以输出应该是:1996.
我尝试使用 match() 没有成功。提前谢谢你。
【问题讨论】:
我们可以使用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]
【讨论】:
如果你的 A 是非负数
B[ match(FALSE, cummax(A) == 0) ]
【讨论】:
现有的答案都很棒。只是想我会用一种可读性很强的 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")`。 ;-)
另一个基本 R 选项
with(
df,
ColumnB[which.min(ColumnA <= 0)]
)
给了
[1] 1996
【讨论】: