您可以使用dplyr::group_split()
library(dplyr)
iris %>%
group_by(Species) %>%
group_split()
,
如果您尝试拆分和循环,请尝试拆分并lapply / vapply:
vapply(split(mtcars,mtcars$cyl),function(df) mean(df$mpg),double(1))
,
似乎真正的目标是从“ Class_Name”分组的总数据集中收集摘要数据,并且确实没有必要将其拆分为不同的数据框。对于base R和dplyr软件包,有几个很好的选择可以执行此摘要。
下面是使用split/sapply
,tapply
和group_by/summarize
技术的示例。
df<-read.table(header=TRUE,text='Grade Class_Dept Class_Name Class_Work
9 English "English 1" 30
10 History "Modern World" 50
11 Science "AP Chem" 85
12 Math "Calc BC" 45')
#Base R solution
#split into a list of dataframes by Class_name
dflist<-split(df,df$Class_Name)
#perform math operation on each dataframe
workmean<-sapply(dflist,function(x){ mean(x$Class_Work)})
workstdev<-sapply(dflist,function(x){ sd(x$Class_Work)})
workmean
# AP Chem Calc BC English 1 Modern World
# 85 45 30 50
#tapply option:
tapply(df$Class_Work,df$Class_Name,mean)
# AP Chem Calc BC English 1 Modern World
# 85 45 30 50
#dplyr solution
library(dplyr)
df %>% group_by(Class_Name) %>% summarize(mean=mean(Class_Work),stdev=sd(Class_Work))
# # A tibble: 4 x 3
# Class_Name mean stdev
# <fct> <dbl> <dbl>
# 1 AP Chem 85 NaN
# 2 Calc BC 45 NaN
# 3 English 1 30 NaN
# 4 Modern World 50 NaN
,
您可以data.table
包装吗:
> dt <- iris
> setDT(dt)[,.(mean=mean(Petal.Width),std_dv=sd(Sepal.Length)),by=.(Species)]
Species mean std_dv
1: setosa 0.246 0.3524897
2: versicolor 1.326 0.5161711
3: virginica 2.026 0.6358796
本文链接:https://www.f2er.com/3055205.html