单个tapply或AGGRATE语句中的多个函数

单个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

是否可以在一个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  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