问题描述
我的数据有多个列,其中一些列在不同的行中有缺失值。我想按变量“g”对数据进行分组(折叠),保留每个变量的最后一个非缺失观察。
输入:
d <- data.table(a=c(1,NA,3,4),b=c(1,2,c=c(NA,'c',NA),g=c(1,1,2))
期望的输出
d_g <- data.table(a=c(1,b=c(2,'c'),2))
OBS:这与this question有关,但那里的主要答案似乎在某些组中引起了不必要的 NA
解决方法
使用data.table
:
library(data.table)
d[,lapply(.SD,function(x) last(na.omit(x))),g]
# g a b c
#1: 1 1 2 <NA>
#2: 2 4 4 c
,
使用 dplyr
的一个选项可能是:
d %>%
group_by(g) %>%
summarise(across(everything(),~ if(all(is.na(.))) NA else last(na.omit(.))))
g a b c
<dbl> <dbl> <dbl> <chr>
1 1 1 2 <NA>
2 2 4 4 c
,
在base中aggregate
可以使用。
aggregate(.~g,d,function(x) tail(x[!is.na(x)],1),na.action = NULL)
# g a b c
#1 1 1 2
#2 2 4 4 c