循环遍历数据框中的变量以查找摘要统计信息

时间:2018-03-15 18:03:20

标签: r for-loop dataframe

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

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

其中x是colnames(my_dataframe)

并非每个变量都是数字 - 但是当我在循环中添加打印时,这样可以正常工作 - 它只是在适用时打印方式,而在不适用时打印NA。但是,当我尝试将此循环分配给一个值(意味着< - for ....)时,它会生成一个空列表。同样,当我尝试将结果直接写入csv时,我得到一个空的csv。有谁知道为什么会发生这种情况/如何解决?

4 个答案:

答案 0 :(得分:2)

这对你有用。你不需要循环。只需使用summary()函数。

summary(cars)

答案 1 :(得分:0)

您可以使用lapplysapply进行此类操作。 e.g。

sapply(my_dataframe, mean)

将为您提供所有方法。您也可以给它自己的功能,例如

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

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

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

如果没有dplyr,您可以

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

答案 2 :(得分:0)

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 :(得分:0)

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

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()
  2. 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
    2. 仅汇总数字列。你可以避免这种错误。

      方法:

      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列