在data.table中获取每列最后一个非NA行的值

6

我有一个datatable,每一列代表一个时间序列,我想以列为顺序抓取每个时间序列中的最后一个NA值。在我的特定用例中,我的数据看起来像这样:

a   b     c
1   2     5
1   -17   9
NA  11    4
NA  57    NA
63  NA    NA

因此,我想提取以下内容:

a   b    c
63  57   4

我该如何实现这个功能?到目前为止,我只看到一些解答回答了相反的情况,即提取每行而不是每列的最后一个非NA值。
2个回答

10

对于希望仅使用基本的R的人。

sapply(df, function(x) x[max(which(!is.na(x)))])

何处

df <- data.frame(a = c(1, 1, NA, NA, 63),
                 b = c(2, -17, 11, 57, NA),
                 c = c(5, 9, 4, NA, NA))

8
如果数据集是 data.table,则循环遍历数据表的子集(.SD),对非空元素进行子集化(x[!is.na(x)])并从其中提取最后一个元素,使用 tail 函数。
df1[, lapply(.SD, function(x) tail(x[!is.na(x)],1))]
#   a  b c
#1: 63 57 4

3
apply(df1,2,function(x)x[max(which(!is.na(x)))]) - R.S.
@akrun,按行进行操作是否可行?输出:5、9、4、57、63?(不确定这是否值得新问题) - Rafael
1
@RafaelMartins 可能你需要 do.call(pmax, c(df1, na.rm = TRUE)) # [1] 5 9 11 57 63 - akrun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接