我有这样一个简单的数据框:ID Col1 Col2 Col3 Col41 NA NA NA NA 1 5 10 NA NA1 NA NA 15 202 NA NA NA NA 2 25 30 NA NA2 NA NA 35 40 我想这样重新格式化:ID Col1 Col2 Col3 Col41 5 10 15 202 25 30 35 40(请注意:实际数据集有数千行,其值来自生物学数据NA-s不遵循简单的模式,除了NAs不相交,是的,每个正好有3行ID)。步骤1:摆脱仅包含NA值的行。从表面上看,这看起来很简单,但是我遇到了一些问题。complete.cases(DF)返回all FALSE,所以我不能真正使用它来删除所有带有NAs 的行,如中所示DF[complete.cases(DF),]。这是因为所有行都至少包含一个NA。由于NAs想要传播自己,因此其他使用is.na相同方案的失败。第二步:将剩余的两行折叠为一。考虑使用类似的aggregate方法,但是必须有一个比this更简单的方法,这根本行不通。感谢您的任何建议。
3 回答
慕妹3242003
TA贡献1824条经验 获得超6个赞
以下是一些汇总尝试:
aggregate(. ~ ID, data=dat, FUN=na.omit, na.action="na.pass")
# ID Col1 Col2 Col3 Col4
#1 1 5 10 15 20
#2 2 25 30 35 40
由于aggregate默认情况下,公式接口na.omit会在进行任何分组之前使用整个数据,因此它将删除其中的每一行,dat因为它们都至少包含一个NA值。试试看:nrow(na.omit(dat))return 0。因此,在这种情况下,请使用na.passin aggregate,然后na.omit跳过NA通过的。
或者,不要使用公式接口并指定要手动汇总的列:
aggregate(dat[-1], dat[1], FUN=na.omit )
aggregate(dat[c("Col1","Col2","Col3","Col4")], dat["ID"], FUN=na.omit)
# ID Col1 Col2 Col3 Col4
#1 1 5 10 15 20
#2 2 25 30 35 40
- 3 回答
- 0 关注
- 510 浏览
添加回答
举报
0/150
提交
取消