【问题标题】:Deleting rows if there are more than 25% NAs in multiple columns如果多列中的 NA 超过 25%,则删除行
【发布时间】:2021-08-25 22:46:00
【问题描述】:

我想删除多列中包含超过 25% NA 的所有行。由于这涉及大约 120 个相应的列,因此不指定所​​有列会很方便。最好是类似:columnA 和 columnZ 之间的所有内容。

我尝试过使用:

data[!is.na(data$ColumnA:data$ColumnZ), > 0.25]

但它只显示了这个错误:

必须使用有效的下标向量对列进行子集化。
逻辑下标必须与索引输入的大小匹配。
x 输入的大小为 250,但下标 !is.na(data$ColumnA:data$ColumnZ) > 0.25 的大小为 3。

(250是数据集中的实际列数)

我也考虑过尝试 drop_na,但这会导致类似的问题。

你有什么建议吗?提前谢谢你

【问题讨论】:

  • 您能否通过dput(head(data)) 分享您的数据的可重现样本?以便其他人可以使用它来帮助您。
  • df[rowMeans(is.na(df)) < 0.25, ]
  • @alistaire,我想您仍然需要按名称或索引对列进行子集化,例如 df[rowMeans(is.na(df[,paste0("Column", LETTERS[1:26])])) < 0.25, ]

标签: r subset na


【解决方案1】:

您可以使用rowMeans(is.na(.)

数据:

set.seed(1)
df<-tibble(matrix(sample(c(1, NA), 64, replace=TRUE, prob = c(0.75, 0.25)), nrow=8))

# A tibble: 8 x 1
  `matrix(...)`[,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]
              <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1                 1     1     1     1     1     1     1    NA
2                 1     1     1     1    NA     1     1     1
3                 1    NA     1     1     1     1     1    NA
4                 1     1     1     1    NA    NA    NA     1
5                 1     1     1     1    NA    NA     1    NA
6                 1     1    NA     1     1     1     1     1
7                NA     1     1     1     1     1    NA     1
8                 1     1     1     1     1    NA     1     1

过滤器:

df%>%filter(rowMeans(is.na(.))<0.25)

# A tibble: 4 x 1
  `matrix(...)`[,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]
              <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1                 1     1     1     1     1     1     1    NA
2                 1     1     1     1    NA     1     1     1
3                 1     1    NA     1     1     1     1     1
4                 1     1     1     1     1    NA     1     1

或者用 rowwise():

df%>%
        rowwise()%>%
        filter(mean(is.na(c_across(everything())))<0.25)

【讨论】:

    【解决方案2】:

    我通常使用tidyversenaniar 包来处理此类任务。

    这是一个使用“空气质量”内置数据集来识别具有 >25% NA(缺失值)的行的示例:

    library(tidyverse)
    library(naniar)
    
    data(airquality)
    dat1 <- airquality
    miss_case_summary(dat1) %>% 
      filter(pct_miss >= 25)
    
    # A tibble: 2 x 3
    #   case n_miss pct_miss
    #  <int>  <int>    <dbl>
    #1     5      2     33.3
    #2    27      2     33.3
    

    并排除这两种情况(行):

    dat2 <- dat1 %>% 
      slice(-c(5, 27))
    

    如果您的数据集中有大量 NA,您可以使用:

    list_of_gt25_NAs <- miss_case_summary(dat1) %>% 
      filter(pct_miss >= 25)
    
    dat2 <- dat1 %>% 
      slice(-c(list_of_gt25_NAs$case))
    

    【讨论】:

      猜你喜欢
      • 2018-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-16
      相关资源
      最近更新 更多