【问题标题】:Add a column with count of NAs and Mean添加一个包含 NAs 和 Mean 计数的列
【发布时间】:2016-05-28 08:31:34
【问题描述】:

我有一个数据框,我需要向其中添加另一列,以显示该行所有其他列中的 NA 计数以及非 NA 值的平均值。 我认为它可以在 dplyr 中完成。

> df1 <- data.frame(a = 1:5, b = c(1,2,NA,4,NA), c = c(NA,2,3,NA,NA))
> df1
  a  b  c
1 1  1 NA
2 2  2  2
3 3 NA  3
4 4  4 NA
5 5 NA NA

我想改变计算该行中 NA 数量的另一列和显示该行中所有 NON-NA 值的平均值的另一列。

【问题讨论】:

  • 这通常不是要求我们为您编写代码的论坛。你试过什么?为什么要使用dplyr? FWIW,这可以很容易地在基础 R 中以多种方式完成。一种是:df1$na &lt;- apply(is.na(df1), 1, sum)
  • 这里描述dplyr方式:stackoverflow.com/questions/21818181/…

标签: r dplyr na


【解决方案1】:
library(dplyr)

count_na <- function(x) sum(is.na(x))    

df1 %>%
  mutate(means = rowMeans(., na.rm = T),
         count_na = apply(., 1, count_na))

#### ANSWER FOR RADEK ####
elected_cols <- c('b', 'c')

df1 %>%
  mutate(means = rowMeans(.[elected_cols], na.rm = T),
         count_na = apply(.[elected_cols], 1, count_na))

【讨论】:

  • 您将如何修改此解决方案以使其仅适用于选定的列?比如b&c?
  • @radek 在此页面上查看我的答案
  • @radek - 我更新了解决方案来回答你的问题。
【解决方案2】:

这里提到https://stackoverflow.com/a/37732069/2292993

df1 <- data.frame(a = 1:5, b = c(1,2,NA,4,NA), c = c(NA,2,3,NA,NA))

df1 %>%
  mutate(means = rowMeans(., na.rm = T),
         count_na = rowSums(is.na(.)))

在选定的列上工作(这里的示例是列 a 和列 c):

df1 %>%
  mutate(means = rowMeans(., na.rm = T),
       count_na = rowSums(is.na(select(.,one_of(c('a','c'))))))

【讨论】:

    【解决方案3】:

    你可以试试这个:

    #Find the row mean and add it to a new column in the dataframe
    df1$Mean <- rowMeans(df1, na.rm = TRUE)
    
    #Find the count of NA and add it to a new column in the dataframe
    df1$CountNa <- rowSums(apply(is.na(df1), 2, as.numeric))
    

    【讨论】:

      【解决方案4】:

      我最近遇到了这个问题的一个变体,我需要计算完整值的百分比,但针对特定变量(不是所有变量)。这是一种对我有用的方法。

      df1 %>% 
        # create dummy variables representing if the observation is missing ----
        # can modify here for specific variables ----
        mutate_all(list(dummy = is.na)) %>% 
        # compute a row wise sum of missing ----
        rowwise() %>% 
        mutate(
          # number of missing observations ----
          n_miss = sum(c_across(matches("_dummy"))),
          # percent of observations that are complete (non-missing) ----
          pct_complete = 1 - mean(c_across(matches("_dummy")))
        ) %>% 
        # remove grouping from rowwise ---- 
        ungroup() %>% 
        # remove dummy variables ----
        dplyr::select(-matches("dummy"))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-19
        • 2022-01-07
        • 2020-11-25
        • 2021-10-02
        • 2018-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多