data.table中按id的子集行

我觉得data.table这个问题必须有一个简单的解决方案。我有以下数据:

library(data.table)

data <- data.table(
    id = c(1,1,1,2,2,3),
    income_year0 = c(NA,NA,100,NA,200,NA),
    income_year1 = c(NA, 105, NA, 202,NA, 255),
    income_year2 = c(102, NA,NA,NA,NA,NA)
)

我想为每个唯一的 id 创建一个新的列收入,该列的值是income_year0(如果不是NA),否则是值income_year1(如果不是 NA),否则是 值income_year2,如果都是 NA,则收入是 NA。

也就是说,我希望每个 id 一行有一个收入列,如下所示:

data_want <- data.table(
    id = c(1,2,3),
    income = c(100,200,255)
)

回答

您可以取消列出列并选择第一个非 NA 值。

library(data.table)
data[, .(income = na.omit(unlist(.SD))[1]), id]

#   id income
#1:  1    100
#2:  2    200
#3:  3    255


回答

另一个选项as.matrix+is.na

> data[, .(income = first(as.matrix(.SD)[!is.na(.SD)])), id]
   id income
1:  1    100
2:  2    200
3:  3    255


回答

我们可以重塑宽到长,然后得到第一个非 na 行:

melt(data, id.vars = "id", na.rm = TRUE)[, .(income = first(value)), id]
#    id income
# 1:  1    100
# 2:  2    200
# 3:  3    255


以上是data.table中按id的子集行的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>