【问题标题】:Looping through variables in a dataframe to find summary stats循环遍历数据框中的变量以查找摘要统计信息
【发布时间】:2018-03-15 18:03:19
【问题描述】:

我对 R 了解不多,并且我在数据框中有一个变量,我正在尝试计算一些统计数据,希望将它们写入 csv。我一直在使用基本的 for 循环,如下所示:

for(i in x) {
    mean(my_dataframe[,c(i)], na.rm = TRUE))
}

其中 x 是 colnames(my_dataframe)

不是每个变量都是数字的——但是当我在循环中添加一个 print 时,它工作得很好——它只是在适用时打印意味着,在不适用时打印 NA。但是,当我尝试将此循环分配给一个值(意味着

【问题讨论】:

    标签: r for-loop dataframe


    【解决方案1】:

    这应该适合你。你不需要循环。只需使用 summary() 函数即可。

    summary(cars)
    

    【讨论】:

      【解决方案2】:

      for 循环执行里面的代码,但它没有把任何结果放在一起。为此,您需要创建一个对象来保存结果并显式分配每个结果:

      my_means = rep(NA, ncol(my_dataframe)
      for(i in seq_along(x)) {
          my_means[i] = mean(my_dataframe[, x[i], na.rm = TRUE))
      }
      

      请注意,我还更改了您的循环以使用 i = 1, 2, 3, ... 而不是每个名称。

      sapply,如另一个答案所示,是一个很好的快捷方式,可以为您执行循环并组合结果,因此您无需担心预先分配结果对象。它也很聪明,可以默认遍历数据框的列。

      my_means_2 = sapply(my_dataframe, mean, na.rm = T)
      

      【讨论】:

        【解决方案3】:

        请在您下次发布问题时提供可重现的示例。

        Input 是我想象中您的数据的样子。

        输入:

        library(nycflights13)
        library(tidyverse)
        input <- flights %>% select(origin, air_time, carrier, arr_delay)
        
        input
        # A tibble: 336,776 x 4
           origin air_time carrier arr_delay
           <chr>     <dbl> <chr>       <dbl>
         1 EWR        227. UA            11.
         2 LGA        227. UA            20.
         3 JFK        160. AA            33.
         4 JFK        183. B6           -18.
         5 LGA        116. DL           -25.
         6 EWR        150. UA            12.
         7 EWR        158. B6            19.
         8 LGA         53. EV           -14.
         9 JFK        140. B6            -8.
        10 LGA        138. AA             8.
        # ... with 336,766 more rows
        

        在我看来,有两种方法:

        1. 使用summarise_all()

        summarise_all() 将汇总您的所有列,包括非数字列。

        方法:

        input %>% summarise_all(funs(mean(., na.rm = TRUE)))
        # A tibble: 1 x 4
          origin air_time carrier arr_delay
           <dbl>    <dbl>   <dbl>     <dbl>
        1     NA     151.      NA      6.90
        
        Warning messages:
        1: In mean.default(origin, na.rm = TRUE) :
          argument is not numeric or logical: returning NA
        2: In mean.default(carrier, na.rm = TRUE) :
          argument is not numeric or logical: returning NA
        

        如果你使用这个方法,你会得到一个结果和一个警告。

        1. 使用summarise_if

        仅汇总数字列。这样可以避免出现任何错误。

        方法:

        input %>% summarise_if(is.numeric, funs(mean(., na.rm = TRUE)))
        # A tibble: 1 x 2
          air_time arr_delay
             <dbl>     <dbl>
        1     151.      6.90
        

        然后您可以为其他人创建一个 NA 列

        【讨论】:

          【解决方案4】:

          您可以使用lapplysapply 来处理这类事情。例如

          sapply(my_dataframe, mean)

          将为您提供一切。你也可以给它你自己的功能,例如

          sapply(my_dataframe, function(x) sum(x^2 + 2)/4 - 9)

          如果所有变量都不是数字,您可以使用dplyr 中的summarise_if 来获取数字列的结果。

          require(dplyr)
          my_dataframe %>% 
            summarise_if(is.numeric, mean)
          

          没有dplyr,你可以这样做

          sapply(my_dataframe[sapply(my_dataframe, is.numeric)], mean)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-03-07
            • 1970-01-01
            • 1970-01-01
            • 2013-05-18
            • 2018-07-17
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多