【问题标题】:Only omit NA that does not overlap with other NA in a certain column仅省略某一列中不与其他 NA 重叠的 NA
【发布时间】:2020-02-17 17:28:34
【问题描述】:

假设我有一个如下所示的数据框:

>df
col1   col2   col3

 12    NA      2 
 21    11     NA
 NA     2     NA
 3     NA     NA
 NA    NA      4
 8     12      5
 41    39      9

我想省略 NA,但是 col3 中的 NA 是一条宝贵的信息,所以我不想在没有更多信息的情况下用任何其他值填充它。因此,我只想省略与 col3 中的 NA 不重叠的 NA。

所以它看起来像这样:

>df
col1   col2   col3

 21    11     NA
 NA     2     NA
 3     NA     NA
 8     12      5
 41    39      9

col2 和 col1 中的 NA 仍然存在的唯一原因是因为删除它们的行会导致 col3 中的 NA 也被删除,这是我想要防止的。因此,我可以容忍 col1 和 col2 中剩余的 NA。

我有什么方便的方法或任何包来解决这个问题吗?我试过使用过滤器:

df <- df %>% filter(complete.cases(df[, -3]))

但它变成了这样,因为有重叠的 NA :

 >df
 col1   col2   col3

 21    11     NA
 8     12      5
 41    39      9

有什么想法吗?先谢谢了~

【问题讨论】:

  • 你如何定义重叠?
  • 如果 col1 或 col2 上的任何 NA 与 col3 中的 NA 在同一行,这就是我确定为重叠的方式。请原谅我在解释问题时缺乏词汇。

标签: r dataframe missing-data


【解决方案1】:

我们可以用rowSums创建一个条件

df1[!(rowSums(is.na(df1[-3])) > 0 & !is.na(df1[[3]])),]
#  col1 col2 col3
#2   21   11   NA
#3   NA    2   NA
#4    3   NA   NA
#6    8   12    5
#7   41   39    9

当我们执行rowSums(is.na(df1[-3])) &gt; 0 时,它会检查前两列中的任何 NA 并针对这些情况返回 TRUE

rowSums(is.na(df1[-3])) > 0
#[1]  TRUE FALSE  TRUE  TRUE  TRUE FALSE FALSE

但是,我们想删除第一行,因为在 'col3' 中该行没有 NA

接下来我们检查'col3'中的NAs

is.na(df1[[3]])
#[1] FALSE  TRUE  TRUE  TRUE FALSE FALSE FALSE

只要有 TRUE,我们就想保留它。因此,如果我们执行&amp;,它将返回两者中常见的NA

(rowSums(is.na(df1[-3])) > 0 & !is.na(df1[[3]]))
#[1]  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE

即第 1 行和第 5 行在两个列块中都有 NA。否定它会改变TRUE-&gt; FALSEFALSE-&gt; TRUE

!(rowSums(is.na(df1[-3])) > 0 & !is.na(df1[[3]]))
#[1] FALSE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE

哪些行可以有两个集合没有任何 NA 或 'col3' 有 NA 和其他行可能有也可能没有 NA


或者在filter中使用同样的逻辑

library(dplyr)
df1  %>%
     filter(!(rowSums(is.na(.[-3])) > 0 & !is.na(col3)))

数据

df1 <- structure(list(col1 = c(12L, 21L, NA, 3L, NA, 8L, 41L), col2 = c(NA, 
11L, 2L, NA, NA, 12L, 39L), col3 = c(2L, NA, NA, NA, 4L, 5L, 
9L)), class = "data.frame", row.names = c(NA, -7L))

【讨论】:

  • 谢谢,我试过了,它有效。您能否详细说明一下,以便我了解发生了什么?
  • @Lutfi 更新了帖子
  • 非常感谢~这个解释很好~!
猜你喜欢
  • 1970-01-01
  • 2015-03-28
  • 2015-03-18
  • 2015-07-07
  • 2012-06-30
  • 1970-01-01
  • 2018-10-18
  • 1970-01-01
相关资源
最近更新 更多