将计算列添加到数据帧R
我想从一个数据帧计算一些列的统计数据(平均值、最小值、最大值、标准偏差等),并将这些值存储为另一个数据帧 以下是一个示例:将计算列添加到数据帧R,r,dataframe,R,Dataframe,我想从一个数据帧计算一些列的统计数据(平均值、最小值、最大值、标准偏差等),并将这些值存储为另一个数据帧 以下是一个示例: >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
>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
}
我想通过一个循环来实现这一点,比如:
>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
}
#结果数据帧
bar我们可以在感兴趣的列上循环,得到mean
和min
sapply(foo[c('Col1', 'Col3')], function(x) c(Mean = mean(x), Min =min(x)))
# Col1 Col3
#Mean 3 30
#Min 1 10
注意:基于应用的解决方案也是一个循环。但是,如果您对tidyverse
解决方案感兴趣,它在理解输出方面比for
循环提供了更多的控制
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
库(tidyverse)
富%
聚集(列,值)%>%
分组依据(列)%>%
总结(平均值=平均值(值),最小值=最小值(值))
#>#tibble:4 x 3
#>Col平均最小值
#>
#>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
foo%>%
聚集(列,值)%>%
分组依据(列)%>%
总结(平均值=平均值),
最小值=最小值(值))%>%
聚集(函数,值,2:3)%>%
排列(列,值)%>%
选择(函数、列1、列3)
#一个tibble:2x3
#Func Col1 Col3
#
#1平均3 30
#2最少110
您可以使用tidyverse
工具完成此操作。实际的计算只是摘要
,其余的只是将输出转换为所需的格式
库(tidyverse)
富%
聚集(统计,值)%>%
分离(stat,into=c(“Col”,“Func”))%>%
价差(Col,value)
酒吧
#>#tibble:2 x 3
#>Func Col1 Col3
#>
#>1平均3 30
#>2分110秒
由(v0.2.0)于2018-06-04创建。使用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
我不熟悉tidyverse,但会尝试一下!查看更新后的答案,以及您问题中所问的准确输出