希望有人能帮助我一招 . 我在网上找到了类似的问题,但我见过的所有例子都没有完全符合我的要求,也没有在我的数据结构上工作 .
我需要沿数据子集从数据帧中删除NA,并将剩余的NA值压缩为每个数据子集的行 .
例:
#create example data
a <- c(1, 1, 1, 2, 2, 2) #this is the subsetting variable in the example
b <- c(NA, NA, "B", NA, NA, "C") #max 1 non-NA value for each subset
c <- c("A", NA, NA, "A", NA, NA)
d <- c(NA, NA, 1, NA, NA, NA) #some subsets for some columns have all NA values
dat <- as.data.frame(cbind(a, b, c, d))
> desired output
a b c d
1 B A 1
2 C A <NA>
经验法则:1)需要从每列中删除NA值2)沿数据子集循环(上例中的“a”列)3)每个子集的所有列最多具有1个非NA值,但有些列可以具有所有NA值
思路:
- lapply或dplyr可能有助于循环所有列
如果可以忽略具有所有行条目的子集列(例如as.data.frame(lapply(dat.admin,na.omit))),则 - na.omit可能会有所帮助 . 如果某些子集未返回任何非NA值,则将lapply输出返回到数据帧会出现问题
如果费力地应用于每个单独的列, - x [which.min(is.na(x))]有效地实现了这一点
感谢任何帮助将最终作品组合在一起!谢谢!
3 回答
使用
dplyr::summarise_all
可以实现一个解决方案 .a
上的数据需要group_by
.data.table
和na.omit
的解决方案我认为合并声明可以改进
不确定这是否是您正在寻找的,但这可能对您有用 . 它至少会复制您正在寻找的小样本输出:
您也可以只使用
dplyr
: