将计算列添加到数据帧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,但会尝试一下!查看更新后的答案,以及您问题中所问的准确输出