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