R 按行选择行中的最后一个值

R 按行选择行中的最后一个值,r,dataframe,R,Dataframe,我有一个数据帧,其中每一行都是一个不同长度的值向量。我想创建每行中最后一个真值的向量 以下是一个示例数据帧: df <- read.table(tc <- textConnection(" var1 var2 var3 var4 1 2 NA NA 4 4 NA 6 2 NA 3 NA 4

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

以下是一个示例数据帧:

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)

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

  • is.NA
  • tail
  • 使用
    apply
    将此功能应用于
    data.frame中的每一行
守则:

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

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

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

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

下面是一个使用矩阵子集的答案:

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

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

+1用于创建可复制的dataSweet!我知道这一定有个功能:尾巴。非常感谢——标记为已回答!或者,更优雅的
apply(df,1,函数(x){tail(x[!is.na(x)],1)}
是更优雅还是更紧凑?我想我更喜欢Andrie的解决方案(太糟糕了,
tail
没有
na.rm
参数,那么你可以只做
apply(df,1,tail,n=1,na.rm=TRUE)
…对我来说,这似乎并不优雅。行数更少,但在其他方面完全相同。我认为优雅是指更好的算法,更好的现有表达式,或是更简单地完成任务的函数。像这样的一行程序看起来杂乱无章,令人困惑,特别是对新手来说……记住白令又回到了新手的状态。