我想计算数据帧中某些列的一些统计信息(平均值,最小值,最大值,标准差等),并将这些值存储为另一个数据帧。
以下是一个示例:
>foo
Col1 Col2 Col3 Col4
1 1 6 10 60
2 2 7 20 70
3 3 8 30 80
4 4 9 40 90
5 5 10 50 100
例如,我想将Col1和Col3的平均值和最小值存储在这样的数据帧中:
>bar
Col1 Col3
Mean 3 30
Min 1 10
我想通过一个循环来做到这一点,如下所示:
# Result dataframe
bar <- data.frame(Col1 = integer(), Col3 = integer())
variables_for_stats <- c("Col1","Col3")
# I want to do something on the lines of this:
for (z in variables_for_stats){
# Populate column with required values
col <- c(mean(foo$z,min(foo$z)) # Throws an error - argument is not numeric or logical: returning NA
# Add col to 'bar'
bar$z<- col # Does not work
}
我的实际foo数据框目前有大约40列,实际变量_for_stats大约为20.这两个都可以改变,因此希望通过for循环和列表来实现。我该怎么做?
答案 0 :(得分:3)
我们可以遍历感兴趣的列并获取mean
和min
sapply(foo[c('Col1', 'Col3')], function(x) c(Mean = mean(x), Min =min(x)))
# Col1 Col3
#Mean 3 30
#Min 1 10
注意:基于应用的解决方案也是一个循环。但是,它在理解输出
时提供了比for
循环更多的控制
答案 1 :(得分:3)
如果您对tidyverse
解决方案感兴趣...
library(tidyverse)
foo <- tribble(~Col1, ~Col2, ~Col3, ~Col4,
1, 6, 10, 60,
2, 7, 20, 70,
3, 8, 30, 80,
4, 9, 40, 90,
5, 10, 50, 100)
foo %>%
gather(Col, Value) %>%
group_by(Col) %>%
summarise(Mean = mean(Value), Minimum = min(Value))
#> # A tibble: 4 x 3
#> Col Mean Minimum
#> <chr> <dbl> <dbl>
#> 1 Col1 3 1
#> 2 Col2 8 6
#> 3 Col3 30 10
#> 4 Col4 80 60
修改强> 如果您希望结果数据框与您在问题中指出的完全一致,那么:
foo %>%
gather(Col, Value) %>%
group_by(Col) %>%
summarise(Mean = mean(Value),
Minimum = min(Value)) %>%
gather(Func, Value, 2:3) %>%
spread(Col, Value) %>%
select(Func, Col1, Col3)
# A tibble: 2 x 3
# Func Col1 Col3
# <chr> <dbl> <dbl>
#1 Mean 3 30
#2 Minimum 1 10
答案 2 :(得分:2)
使用base R,您可以执行以下操作:
aggregate( values~ind,stack(foo),function(x)
c(mean=mean(x),sd=sd(x),min=min(x),max=max(x)))#Write all the functions you want
ind values.mean values.sd values.min values.max
1 Col1 3.000000 1.581139 1.000000 5.000000
2 Col2 8.000000 1.581139 6.000000 10.000000
3 Col3 30.000000 15.811388 10.000000 50.000000
4 Col4 80.000000 15.811388 60.000000 100.000000
如果有的话,你只需要摘要统计数据:
library(tidyverse)
summary(foo)%>%
data.frame()%>%
select(-Var1)%>%
separate(Freq,c("Fun","Val"),":")%>%
spread(Fun, Val)
Var2 1st Qu. 3rd Qu. Max. Mean Median Min.
1 Col1 2 4 5 3 3 1
2 Col2 7 9 10 8 8 6
3 Col3 20 40 50 30 30 10
4 Col4 70 90 100 80 80 60
答案 3 :(得分:1)
您可以使用summarise
工具执行此操作。实际计算只是library(tidyverse)
foo <- read_table2(
"Col1 Col2 Col3 Col4
1 6 10 60
2 7 20 70
3 8 30 80
4 9 40 90
5 10 50 10"
)
bar <- foo %>%
summarise_at(
.vars = vars(Col1, Col3),
.funs = funs(mean, min)
) %>%
gather(stat, value) %>%
separate(stat, into = c("Col", "Func")) %>%
spread(Col, value)
bar
#> # A tibble: 2 x 3
#> Func Col1 Col3
#> <chr> <dbl> <dbl>
#> 1 mean 3 30
#> 2 min 1 10
,其余的只是将输出转换为您想要的格式。
{{1}}
由reprex package(v0.2.0)创建于2018-06-04。