You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

R语言如何提取每行的最后一个非NA值?

嘿,作为R语言新手碰到这个需求太正常啦!我来给你分享几个简单易懂的方法,轻松搞定每行最后一个非NA值的提取,还能新增LastD列~

首先先把你的示例数据用代码还原出来,方便咱们测试:

# 构造示例数据框
df <- data.frame(
  Name = c("Stacy", "Joy", "Anna", "Ray", "Fey"),
  D1 = c(1, NA, NA, 2, 8),
  D2 = c(4, 4, NA, NA, NA),
  D3 = c(NA, 8, 7, 3, NA),
  D4 = c(6, NA, 1, NA, NA),
  D5 = c(NA, 8, NA, NA, NA)
)

方法一:用tidyverse工具(推荐新手,语法直观)

如果你已经在用dplyr这类tidyverse包,这个方法可读性超强:

library(dplyr)

df_result <- df %>%
  rowwise() %>%  # 告诉R我们要按行处理数据
  mutate(
    LastD = tail(na.omit(c_across(starts_with("D"))), 1)
    # c_across(starts_with("D")):选中所有以D开头的列(D1-D5)
    # na.omit():去掉这些列里的NA值
    # tail(1):取剩下值的最后一个
  ) %>%
  ungroup()  # 关闭按行处理模式,恢复常规操作

# 查看结果
print(df_result)

方法二:基础R实现(不用额外加载包)

如果不想加载任何包,用基础R的apply函数也能快速搞定:

# 直接给原数据框新增LastD列
df$LastD <- apply(df[, -1], 1, function(x) {
  # df[, -1]:去掉第一列Name,只保留D1-D5
  # apply(..., 1):按行执行后面的函数
  non_na_vals <- na.omit(x)
  if (length(non_na_vals) == 0) {
    NA  # 处理全是NA的行,返回NA
  } else {
    tail(non_na_vals, 1)
  }
})

# 查看结果
print(df)

两种方法运行后都会得到你想要的结果:

Name D1 D2 D3 D4 D5 LastD
1  Stacy  1  4 NA  6 NA     6
2    Joy NA  4  8 NA  8     8
3   Anna NA NA  7  1 NA     1
4    Ray  2 NA  3 NA NA     3
5    Fey  8 NA NA NA NA     8

小提示:如果你的数据里有全是NA的行,上面的代码已经做了处理,会返回NA而不是报错哦~

内容的提问来源于stack exchange,提问作者Anisa Daraputri

火山引擎 最新活动