【问题标题】:Select last value in a row, by row按行选择一行中的最后一个值
【发布时间】:2015-06-24 13:19:21
【问题描述】:

我有一个数据框,其中每一行都是不同长度值的向量。我想在每一行中创建一个包含最后一个真值的向量。

这是一个示例数据框:

df <- read.table(tc <- textConnection("
   var1    var2    var3    var4
     1       2       NA      NA
     4       4       NA      6
     2       NA      3       NA                
     4       4       4       4              
     1       NA      NA      NA"), header = TRUE); close(tc)

因此,我想要的值向量是c(2,6,3,4,1)。

我只是不知道如何让 R 识别最后一个值。

感谢任何帮助!

【问题讨论】:

  • +1 用于创建可重现的数据

标签: r dataframe


【解决方案1】:

通过结合三件事来做到这一点:

  • 用is.na 标识NA 值
  • 使用tail 查找向量中的最后一个值
  • 使用apply 将此函数应用于data.frame 中的每一行

代码:

lastValue <- function(x)   tail(x[!is.na(x)], 1)

apply(df, 1, lastValue)
[1] 2 6 3 4 1

【讨论】:

  • 甜蜜!我知道必须有一个函数:tail。非常感谢 - 标记为已回答!
  • 或者,更优雅的apply(df, 1, function(x) { tail(x[!is.na(x)], 1) })
  • 是更优雅还是更紧凑?我想我更喜欢 Andrie 的解决方案(太糟糕了 tail 没有 na.rm 参数,那么你可以这样做 apply(df,1,tail,n=1,na.rm=TRUE) ...
  • 这对我来说似乎并不优雅。它的行数较少,但除此之外完全相同。我应该认为优雅是指更好的算法,对现有算法的更好表达,或者更简单地完成任务的某些功能。像这样的班轮往往看起来杂乱无章,尤其是对新手来说……记得回到新手时。
【解决方案2】:

这是使用矩阵子集的答案:

df[cbind( 1:nrow(df), max.col(!is.na(df),"last") )]

此max.col 调用将选择每行中最后一个非 NA 值的位置(如果它们都是 NA,则选择第一个位置)。

【讨论】:

    【解决方案3】:

    这是另一个版本,它在取反向输入的第一个元素之前删除了所有无穷大、NA 和 NaN:

    apply(df, 1, function(x) rev(x[is.finite(x)])[1] )
    # [1] 2 6 3 4 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 2013-05-09
      • 2023-03-06
      • 2014-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多