【发布时间】:2018-03-31 20:15:30
【问题描述】:
我有一个包含 5 维数据的数据框,如下所示:
> dim(alldata)
[1] 162 6
> head(alldata)
value layer Kmultiplier Resolution Season Variable
1: 0.01308008 b .01K 1km Baseflow Evapotranspiration
2: 0.03974779 b .01K 1km Peak Flow Evapotranspiration
3: 0.02396524 b .01K 1km Summer Flow Evapotranspiration
4: -0.15670996 b .01K 1km Baseflow Discharge
5: 0.06774948 b .01K 1km Peak Flow Discharge
6: -0.04138313 b .01K 1km Summer Flow Discharge
我想做的是根据其他列获取数据的某些“特征”的值列的平均值。所以我用 which 将数据子集化为我感兴趣的变量,例如:
> subset=alldata[which(alldata$Variable=="Discharge" & alldata$Resolution=="1km" & alldata$Season=="Peak Flow"),]
> subset
value layer Kmultiplier Resolution Season Variable
1: 0.067749478 b .01K 1km Peak Flow Discharge
2: 0.058260448 b .1K 1km Peak Flow Discharge
3: -0.223953725 b 10K 1km Peak Flow Discharge
4: 0.272916114 g .01K 1km Peak Flow Discharge
5: 0.240135025 g .1K 1km Peak Flow Discharge
6: -0.216730348 g 10K 1km Peak Flow Discharge
7: 0.088966500 s .01K 1km Peak Flow Discharge
8: -0.018943754 s .1K 1km Peak Flow Discharge
9: -0.008339365 s 10K 1km Peak Flow Discharge
这就是我卡住的地方。假设我想要一个向量或“层”列中每个值的平均值列表......所以我最终会得到 3 个数字,一个用于“b”,一个用于“g”,一个用于“s”。我需要制作一堆这样的子集,我认为应用函数可以提供帮助,但是在多个教程和堆栈问题之后,我无法让它工作。一个更简单的例子也可以,像这样:
> A=data.frame(seq(1,9),rep(c("a","b","c"),3),c(rep("type1",3),rep("type2",3),rep("type3",3)),c(rep("place1",2),rep("place2",2),rep("place3",2),rep("place1",2),rep("place2",1)))
> names(A)=c("value","Letter","Type","Place")
> A
value Letter Type Place
1 1 a type1 place1
2 2 b type1 place1
3 3 c type1 place2
4 4 a type2 place2
5 5 b type2 place3
6 6 c type2 place3
7 7 a type3 place1
8 8 b type3 place1
9 9 c type3 place2
从这个简单的例子中,我需要用 Letter 列出的列“value”的平均值来表示“place1”,它应该返回类似:“a=mean value, b=mean value, c=mean value”任何格式都可以。
这是应用功能的工作吗?如果是这样,怎么做?如果没有,请告诉我一个更好的方法来对我的数据进行子集化。
谢谢!
【问题讨论】:
-
对于因子列的组均值或水平明智,请使用
tapply()函数。 -
是的,这是
*apply函数的工作。就像@SowmyaS.Manian 所说,如果每个组只需要一个值,第一个选择是tapply,如果你需要与数据框中的行一样多的输出值(每个组中的值相等),则首选ave.