单个tapply或AGGRATE语句中的多个函数
是否可以在一个tapply或AGGRATE语句中包含两个函数 下面我使用两个tapply语句和两个聚合语句:一个用于平均值,一个用于SD。单个tapply或AGGRATE语句中的多个函数,r,aggregate,tapply,R,Aggregate,Tapply,是否可以在一个tapply或AGGRATE语句中包含两个函数 下面我使用两个tapply语句和两个聚合语句:一个用于平均值,一个用于SD。 我更愿意合并这些陈述 my.Data = read.table(text = " animal age sex weight 1 adult female 100 2 young male 75 3 adult male 90 4 a
我更愿意合并这些陈述
my.Data = read.table(text = "
animal age sex weight
1 adult female 100
2 young male 75
3 adult male 90
4 adult female 95
5 young female 80
", sep = "", header = TRUE)
with(my.Data, tapply(weight, list(age, sex), function(x) {mean(x)}))
with(my.Data, tapply(weight, list(age, sex), function(x) {sd(x) }))
with(my.Data, aggregate(weight ~ age + sex, FUN = mean)
with(my.Data, aggregate(weight ~ age + sex, FUN = sd)
# this does not work:
with(my.Data, tapply(weight, list(age, sex), function(x) {mean(x) ; sd(x)}))
# I would also prefer that the output be formatted something similar to that
# show below. `aggregate` formats the output perfectly. I just cannot figure
# out how to implement two functions in one statement.
age sex mean sd
adult female 97.5 3.535534
adult male 90 NA
young female 80.0 NA
young male 75 NA
我总是可以运行两个单独的语句并合并输出。我只是希望会有
一个稍微方便一点的解决方案
我在这里找到了下面的答案:
我更喜欢R基的解决方案。上面的链接上发布了来自plyr
包的解决方案。如果我能在上面的输出中添加正确的行和列标题,那就太完美了 但是这些应该有:
with(my.Data, aggregate(weight, list(age, sex), function(x) { c(MEAN=mean(x), SD=sd(x) )}))
with(my.Data, tapply(weight, list(age, sex), function(x) { c(mean(x) , sd(x) )} ))
# Not a nice structure but the results are in there
with(my.Data, aggregate(weight ~ age + sex, FUN = function(x) c( SD = sd(x), MN= mean(x) ) ) )
age sex weight.SD weight.MN
1 adult female 3.535534 97.500000
2 young female NA 80.000000
3 adult male NA 90.000000
4 young male NA 75.
要遵循的原则是让函数返回“一件事”,它可以是向量或列表,但不能是两个函数调用的连续调用。如果要使用data.table,它具有内置的
with
和by
:
library(data.table)
myDT <- data.table(my.Data, key="animal")
myDT[, c("mean", "sd") := list(mean(weight), sd(weight)), by=list(age, sex)]
myDT[, list(mean_Aggr=sum(mean(weight)), sd_Aggr=sum(sd(weight))), by=list(age, sex)]
age sex mean_Aggr sd_Aggr
1: adult female 96.0 3.6055513
2: young male 76.5 2.1213203
3: adult male 91.0 1.4142136
4: young female 84.5 0.7071068
库(data.table)
myDT重塑允许传递2个函数;但事实并非如此
library(reshape)
my.Data = read.table(text = "
animal age sex weight
1 adult female 100
2 young male 75
3 adult male 90
4 adult female 95
5 young female 80
", sep = "", header = TRUE)
my.Data[,1]<- NULL
(a1<- melt(my.Data, id=c("age", "sex"), measured=c("weight")))
(cast(a1, age + sex ~ variable, c(mean, sd), fill=NA))
# age sex weight_mean weight_sd
# 1 adult female 97.5 3.535534
# 2 adult male 90.0 NA
# 3 young female 80.0 NA
# 4 young male 75.0 NA
库(重塑)
my.Data=read.table(text=”
动物年龄性别体重
1名成年女性100
2男青年75
3名成年男性90
4成年女性95
5女青年80
“,sep=”“,header=TRUE)
在共享的精神中,如果你熟悉SQL,你也可以考虑“SQLDF”包。(增加强调是因为您确实需要知道,例如,mean
是avg
,以便获得您想要的结果。)
非常感谢。这两个聚合语句起作用。tapply语句似乎不起作用,但我可以使用聚合方法。我认为它“起作用”,只是不给你一些打印得很好的东西。用(my.Data,tapply(weight,list(age,sex),function(x){c(mean(x),sd(x))}))[1,1]尝试,
并尝试使用索引查看列表矩阵内部。我明白了。非常感谢。如果我把整个语句放在colnames()或rownames()中,那么我就会得到标签。这里的结果是一个矩阵,作为第三列的数据帧中的一列。将整个问题包装在do.call(data.frame,…)
中即可轻松解决+1甚至do.call(rbind,…)
as通常对by(…)
操作的结果有效。
library(data.table)
myDT <- data.table(my.Data, key="animal")
myDT[, c("mean", "sd") := list(mean(weight), sd(weight)), by=list(age, sex)]
myDT[, list(mean_Aggr=sum(mean(weight)), sd_Aggr=sum(sd(weight))), by=list(age, sex)]
age sex mean_Aggr sd_Aggr
1: adult female 96.0 3.6055513
2: young male 76.5 2.1213203
3: adult male 91.0 1.4142136
4: young female 84.5 0.7071068
library(reshape)
my.Data = read.table(text = "
animal age sex weight
1 adult female 100
2 young male 75
3 adult male 90
4 adult female 95
5 young female 80
", sep = "", header = TRUE)
my.Data[,1]<- NULL
(a1<- melt(my.Data, id=c("age", "sex"), measured=c("weight")))
(cast(a1, age + sex ~ variable, c(mean, sd), fill=NA))
# age sex weight_mean weight_sd
# 1 adult female 97.5 3.535534
# 2 adult male 90.0 NA
# 3 young female 80.0 NA
# 4 young male 75.0 NA
sqldf("select age, sex,
avg(weight) `Wt.Mean`,
stdev(weight) `Wt.SD`
from `my.Data`
group by age, sex")
age sex Wt.Mean Wt.SD
1 adult female 97.5 3.535534
2 adult male 90.0 0.000000
3 young female 80.0 0.000000
4 young male 75.0 0.000000