为了账号安全,请及时绑定邮箱和手机立即绑定

折叠的行,其中一些全为NA,其他行与某些NA不相交

折叠的行,其中一些全为NA,其他行与某些NA不相交

慕的地8271018 2019-10-22 21:52:14
我有这样一个简单的数据框: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


查看完整回答
反对 回复 2019-10-22
  • 3 回答
  • 0 关注
  • 510 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信