R语言 如何获取最后一个非NA列的值[重复]

fquxozlt  于 2023-01-10  发布在  其他
关注(0)|答案(3)|浏览(234)
    • 此问题在此处已有答案**:

Select last non-NA value in a row, by row(3个答案)
两年前关闭了。
这有点难以解释,但我有一个 Dataframe ,其中的值看起来像一个楼梯-对于每个日期,都有不同的列,其中一些日期的值为NA。我想创建一个新列,其中包含最后一个非NA列的值。
希望这个例子更有意义:
示例 Dataframe :

test <- data.frame("date" = c(as.Date("2020-01-01"), as.Date("2020-01-02"), as.Date("2020-01-03")),
                   "a" = c(4, 3, 4),
                   "b" = c(NA, 2, 1),
                   "c" = c(NA, NA, 5))

预期输出:

date............val
2020-01-01...... 4
2020-01-02...... 2
2020-01-03...... 5

我也不喜欢做一些类似于取日期的行号,然后取列号+1的事情,但是如果这是唯一的方法,那就这样吧。谢谢!

rt4zxlrg

rt4zxlrg1#

下面是一个基于Tidyverse的方法--使用pivot_longer将列转换为行,然后获取每个日期的值不是NA的最后一行:

library(dplyr)
library(tidyr)

test %>% 
    pivot_longer(-date) %>% 
    filter(!is.na(value)) %>% 
    group_by(date) %>% 
    summarize(value = tail(value, 1), .groups = "drop")
3zwtqj6y

3zwtqj6y2#

您可以使用max.col(将ties.method设置为"last")来获取每行中的最后一个非NA值。

test$val <- test[cbind(1:nrow(test), max.col(!is.na(test), ties.method = 'last'))]
test

#        date a  b  c val
#1 2020-01-01 4 NA NA   4
#2 2020-01-02 3  2 NA   2
#3 2020-01-03 4  1  5   5
pn9klfpd

pn9klfpd3#

您也可以使用dplyr的coalesce函数来实现这一点,该函数从提供的向量中获取第一个非缺失元素。

library(dplyr)

test %>%
  mutate(val = coalesce(c, b, a))
#>         date a  b  c val
#> 1 2020-01-01 4 NA NA   4
#> 2 2020-01-02 3  2 NA   2
#> 3 2020-01-03 4  1  5   5

reprex package(v0.3.0)于2020年7月7日创建
注意,如果你有很多列,@tfehring & @Ronak的解决方案会更适合,因为这种方法你必须手动指定你的列,不过它确实有简洁的好处。

相关问题