[英]Add calculated column to dataframe R
我想計算一些數據幀中某些列的統計信息(平均值,最小值,最大值,標准差等),並將這些值存儲為另一個數據幀。
這是一個示例:
>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循環和列表來實現。 我該怎么做?
我們可以遍歷感興趣的列並獲得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
循環更多的控制
如果你對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
使用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
工具執行此tidyverse
。 實際的計算只是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
由reprex包 (v0.2.0)創建於2018-06-04。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.