【问题标题】:Split up a dataframe by number of NAs in each row按每行中的 NA 数量拆分数据帧
【发布时间】:2021-04-27 03:18:07
【问题描述】:

考虑一个由数千行和列组成的数据框,其中包含几个 NA。我想根据每行中 NA 的数量将此数据框拆分为更小的数据框。所有包含相同数量的 NA 的行(如果有的话)应该在同一个组中。然后单独保存新的数据框。

> DF
ID  C1 C2 C3 C4 C5
aa  12 13 10 NA 12 
ff  12 NA NA 23 13
ee  67 23 NA NA 21
jj  31 14 NA 41 11
ss  NA 15 11 12 11

所需的输出将是:

> DF_chunk_1
ID  C1 C2 C3 C4 C5
aa  12 13 10 NA 12
jj  31 14 NA 41 11
ss  NA 15 11 12 11

> DF_chunk_2
ID  C1 C2 C3 C4 C5
ff  12 NA NA 23 13
ee  67 23 NA NA 21

感谢任何建议。

【问题讨论】:

  • 一个指针可能是使用sum(is.na(x)) 将在x 列中返回NAs 的数量。这也可以用于行。

标签: r dataframe split na


【解决方案1】:

尝试以下有用的 cmets。你可以split()和apply()建群:

#Code
new <- split(DF,apply(DF[,-1],1,function(x)sum(is.na(x))))

输出:

$`1`
  ID C1 C2 C3 C4 C5
1 aa 12 13 10 NA 12
4 jj 31 14 NA 41 11
5 ss NA 15 11 12 11

$`2`
  ID C1 C2 C3 C4 C5
2 ff 12 NA NA 23 13
3 ee 67 23 NA NA 21

一种更实用的方法(非常感谢@RuiBarradas):

#Code2
new <- split(DF, rowSums(is.na(DF[-1])))

相同的输出。

【讨论】:

  • 秒杀我,但我使用split(DF, rowSums(is.na(DF[-1])))。
  • @davide_Cent 首先这样做names(new)&lt;-paste0('dfchunck_',names(new)) 然后new &lt;- lapply(new, function(x) {x&lt;-x[,-which(apply(x,2,function(x)sum(is.na(x)))&gt;0)]}) 最后list2env(new,envir = .GlobalEnv)
  • @davide_Cent 在这种情况下,您将拥有一个组 0 并且数据将在那里!
  • @davide_Cent 在 cmets 的代码中尝试此更改 sum(is.na(x)))&gt;=0
  • @davide_Cent 或这个lapply(new, function(x) {x&lt;-x[,-which(apply(x,2,function(x)!is.na(sum(x)))]})
猜你喜欢
  • 2015-05-16
  • 1970-01-01
  • 2022-12-30
  • 1970-01-01
  • 1970-01-01
  • 2014-07-28
  • 1970-01-01
  • 2020-07-16
  • 2021-07-12
相关资源
最近更新 更多