【问题标题】:eliminating categories with a certain number of non-NA values in R消除R中具有一定数量非NA值的类别
【发布时间】:2018-04-04 19:48:46
【问题描述】:

我有一个看起来像这样的数据框 df

  > g <- c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6)
> m <- c(1, NA, NA, NA, 3, NA, 2, 1, 3, NA, 3, NA, NA, 4, NA, NA, NA, 2, 1, NA, 7, 3, NA, 1)
> df <- data.frame(g, m)

其中 g 是类别(1 到 6),m 是该类别中的值。 我设法通过以下方式找到每个类别的无 NA 值的数量:

  aggregate(m ~ g, data=df, function(x) {sum(!is.na(x))}, na.action = NULL)
  g m
1 1 1
2 2 3
3 3 2
4 4 1
5 5 2
6 6 3

现在想消除 None-NA 数量为 1 的行(类别),只保留 NA 数量为 2 及以上的行(类别)。

期望的结果是

   g  m
5  2  3
6  2 NA
7  2  2
8  2  1
9  3  3
10 3 NA
11 3  3
12 3 NA
17 5 NA
18 5  2
19 5  1
20 5 NA
21 6  7
22 6  3
23 6 NA
24 6  1

每个 g=1 和 g=4 都被消除,因为如图所示,每个类别中只有 1 个非 NA

有什么建议吗:)?

【问题讨论】:

  • df[ !is.na(df$m) &amp; df$m &gt; 1, ]。 (如果在aggregate 之后完成,那么在df[ df$m &gt; 1, ] 之后完成。)
  • 删除 m 为 1 的值。这不是我想做的,我想删除我的初始数据框 df 中无 NA 值的数量为 1 的类别。例如第 1 类和第 4 类只有一个非 NA 值。这些是我要删除的行(所有类别 1 和所有类别 4)
  • @Judith 想要的输出是什么?这和我的回答相符吗?
  • 我已经编辑了我的问题并包含了预期的结果

标签: r dataframe na


【解决方案1】:

如果你想要base R,那么我建议你使用你的聚合:

df2 <- aggregate(m ~ g, data=df, function(x) {sum(!is.na(x))}, na.action = NULL)
df[ ! df$g %in% df2$g[df2$m < 2], ]
#    g  m
# 5  2  3
# 6  2 NA
# 7  2  2
# 8  2  1
# 9  3  3
# 10 3 NA
# 11 3  3
# 12 3 NA
# 17 5 NA
# 18 5  2
# 19 5  1
# 20 5 NA
# 21 6  7
# 22 6  3
# 23 6 NA
# 24 6  1

如果你想使用dplyr,也许

library(dplyr)
group_by(df, g) %>%
  filter(sum(!is.na(m)) > 1) %>%
  ungroup()
# # A tibble: 16 × 2
#        g     m
#    <dbl> <dbl>
# 1      2     3
# 2      2    NA
# 3      2     2
# 4      2     1
# 5      3     3
# 6      3    NA
# 7      3     3
# 8      3    NA
# 9      5    NA
# 10     5     2
# 11     5     1
# 12     5    NA
# 13     6     7
# 14     6     3
# 15     6    NA
# 16     6     1

【讨论】:

    【解决方案2】:

    可以尝试基于dplyr 的解决方案。 group_by on g 将有助于获得所需的计数。

    library(dplyr)
    
    df %>% group_by(g) %>%
      filter(!is.na(m)) %>%
      filter(n() >=2) %>%
      summarise(count = n())
    
    #Result
    # # A tibble: 6 x 2
    #     g   count
    #    <dbl> <int>
    # 1  2.00     3
    # 2  3.00     2
    # 3  5.00     2
    # 4  6.00     3
    

    【讨论】:

      猜你喜欢
      • 2018-08-04
      • 1970-01-01
      • 1970-01-01
      • 2020-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多