stackoverflow 社区的新年难题,过去阅读帖子和答案给了我很大的帮助(这是我的第一个问题)。我找到了解决方法,但我想知道是否可以建议其他方法/解决方案。
我正在尝试从大的 中删除尾随的 NA data.frame
,但这些 NA 仅在 的少数列中找到,data.frame
我想保留输出中的所有列。这是一个有代表性的数据子集。
df=data.frame(var1=rep("A", 8), var2=c("a","b","c","d","e","f","g","h"), var3=c(0,1,NA,2,3,NA,NA,NA), var4=c(0,0,NA,4,5,NA,NA,NA), var5=c(0,0,NA,0,2,4,NA,NA))
过程目标:
- 根据 var3、var4 和 var5 中的 NA 存在修剪尾随 NA
- 保留最终输出中的所有列
- 仅删除尾随 NA(即第 3 行作为占位符保留在记录中)
- 仅当所有列都有 NA 时才修剪(即第 7 行和第 8 行,但不是第 6 行)
基于这些目标,解决方案应删除 df 的最后两行:
df.output = df[-c(7,8),]
na.trim (在 zoo 包中)的行为是理想的(因为它限制了对 data.frame 末尾的那些 NA 的删除,sides="right"),我的解决方法涉及更改 na.trim .default 函数以包含子集术语。
有什么建议么?非常感谢您的帮助。
编辑:为了完成这个问题,下面是我从 na.trim.default 代码创建的函数,它也可以工作,但如前所述,确实需要加载 zoo 包。
na.trim.multiplecols <- function (object, colrange, sides = c("both", "left", "right"), is.na = c("any","all"),...)
{
is.na <- match.arg(is.na)
nisna <- if (is.na == "any" || length(dim(object[,colrange])) < 1) {
complete.cases(object[,colrange])
}
else rowSums(!is.na(object[,colrange])) > 0
idx <- switch(match.arg(sides), left = cumsum(nisna) > 0,
right = rev(cumsum(rev(nisna) > 0) > 0), both = (cumsum(nisna) >
0) & rev(cumsum(rev(nisna)) > 0))
if (length(dim(object)) < 2)
object[idx]
else object[idx, , drop = FALSE]
}