我对R不太了解,我在数据框中有一个变量,我试图计算一些统计数据,希望将它们写入csv。我一直在使用基本的for循环,如下所示:
for(i in x) {
mean(my_dataframe[,c(i)], na.rm = TRUE))
}
其中x是colnames(my_dataframe)
并非每个变量都是数字 - 但是当我在循环中添加打印时,这样可以正常工作 - 它只是在适用时打印方式,而在不适用时打印NA。但是,当我尝试将此循环分配给一个值(意味着< - for ....)时,它会生成一个空列表。同样,当我尝试将结果直接写入csv时,我得到一个空的csv。有谁知道为什么会发生这种情况/如何解决?
答案 0 :(得分:2)
这对你有用。你不需要循环。只需使用summary()函数。
summary(cars)
答案 1 :(得分:0)
您可以使用lapply
或sapply
进行此类操作。 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
我看到它的方式,有两种方法可以做到:
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
如果您要使用此方法,您将收到结果和警告。
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列