【问题标题】:Select all non NA values in a data.frame and copy them to a new variable选择 data.frame 中的所有非 NA 值并将它们复制到新变量
【发布时间】:2018-01-06 18:12:19
【问题描述】:

我有一个 data.frame,其中大部分是 NA 值和一些数据。要清理它,我只需要选择并复制所有 NA 值(不是包括 NA 的行或列,而只是值)。这似乎是一项简单的任务,但到目前为止我尝试过的任何解决方案都没有奏效。我想明确指出,我不想在结果变量/文件中保持行数不变,而是逐列逐列删除所有 NA 值。好像这些列在其中单独列出,我会将包含信息/值的所有单元格排序到顶部,并将所有不适用的单元格排序到底部。

谢谢。

更新示例:

Col 1   Col 2   Col 3
Bar     NA      But
NA     There    NA
Foo     NA      NA
NA      NA      Not
NA      NA      NA
Here    NA      NA
NA    Better    NA

想要的结果:

Col1 Col2 Col3
Bar  There But
Foo  Better Not
Here

我需要保持列不变,但列内的所有值都应该向上移动。因此,如果我可以选择所有非 NA 值并将它们粘贴到一个新的数据框(或其他任何内容)中,该数据框包含相同数量的列,但只有值,没有 NA。

希望它更清楚。谢谢。

【问题讨论】:

  • 请提供reproducible example以及预期输出
  • 如果没有示例就无法真正理解,但也许您可以循环/应用所有列,并为每一步将新列插入列表?
  • 对我来说完全不清楚,但也许你正在寻找which(is.na(df),arr.ind=TRUE) (虽然猜测很疯狂;提供一个例子!)
  • 你想要的输出有点奇怪。如果每个列都有不同数量的非 NA 值会发生什么?结果最好有list。您可以让它应用@Florian 答案 (lapply(df,function(x) x[!is.na(x)])) 中建议的第一行。
  • Jep,我知道这很奇怪,这就是为什么我还没有找到答案。将其视为行号无关紧要的清洁工作,所有信息都在单元格中。我只需要获取所有具有值的单元格并保持我的 255 行完整。任何实现这一目标的方法都会很棒。

标签: r dataframe


【解决方案1】:

如果我理解正确,这就是你想要的:

# sample data

df  = data.frame(a=c(1,NA,2),b=c(NA,NA,4))
df2 = lapply(df, function(x) {x[!is.na(x)]})
df3 = sapply(df2, '[', seq(max(sapply(df2,length))))

输入:

   a  b
1  1 NA
2 NA NA
3  2  4

输出 1,作为列表列表:

> df2
$a
[1] 1 2

$b
[1] 4

输出 2,作为数据框:

> df3
     a  b
[1,] 1  4
[2,] 2 NA

希望这会有所帮助!

【讨论】:

  • 猜猜,基于新的编辑,OP 只需要df2
  • 我也这么认为,感谢您的提醒,修改后的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-20
  • 2013-01-01
  • 2019-11-19
  • 1970-01-01
  • 2018-07-21
  • 1970-01-01
相关资源
最近更新 更多