1

我已经在论坛上搜索了一段时间,但我似乎无法找出我的问题的答案(尽管我已经接近了几次)。如果这已经在其他地方得到回答并且我错过了,我很抱歉。

我正在使用 HSAUR2 库中的埃及头骨数据。我将通过下面的代码解释我的问题。我首先加载头骨数据并在其上运行统计摘要(例如箱线图、平均值、标准开发人员等)。这些摘要(此处未显示)按变量(头骨数据的第 2-5 列)和“纪元”(头骨数据的第 1 列)细分。

library(HSAUR2)  # load the skulls data
head(skulls)
#     epoch  mb  bh  bl nh
# 1 c4000BC 131 138  89 49
# 2 c4000BC 125 131  92 48
# 3 c4000BC 131 132  99 50
# 4 c4000BC 119 132  96 44
# 5 c4000BC 136 143 100 54
# 6 c4000BC 138 137  89 56

然后我调用 powerTransform(car包的一部分)来建议适当的转换来转换数据,以便生成的分布“更正常”。我对每个变量/时代组合都有一个转换。

library(car)
tfms_mb <- by(skulls$mb,skulls$epoch, function(x) powerTransform(x))
tfms_bh <- by(skulls$bh,skulls$epoch, function(x) powerTransform(x))
tfms_bl <- by(skulls$bl,skulls$epoch, function(x) powerTransform(x))
tfms_nh <- by(skulls$nh,skulls$epoch, function(x) powerTransform(x))

为了提取系数,我使用sapply.

mbc <- sapply(tfms_mb,coef)
bhc <- sapply(tfms_bh,coef)
blc <- sapply(tfms_bl,coef)
nhc <- sapply(tfms_nh,coef)

问题:

如何对每个变量/纪元对应用适当的转换?我目前正在使用该bct()函数(来自TeachingDemos包)来应用转换,我可以计算出如何使用一个设定值来做到这一点(例如,将所有数据提高到 1.5 的幂):

library(TeachingDemos)
by(skulls[,-1], skulls[,1], function(x) { bct(x,1.5)})

我的问题是,如何替换上一行中的“1.5”,以循环遍历 mbc、bhc 等中的系数并将正确的功率应用于每个变量/时期组合?

我已经阅读了apply几个小时的功能系列以及plyr包装,但这个让我很难过!任何帮助,将不胜感激。

4

2 回答 2

4

这是一个data.table节省内存和时间的解决方案

library(data.table)
SKULLS <- data.table(skulls)

SKULLS[, lapply(.SD, function(x){bct(x,coef(powerTransform(x)))}),by = epoch]
于 2012-10-16T04:29:33.660 回答
1

这是使用lapply两次的解决方案:

library(HSAUR2)
library(car)
library(TeachingDemos) 

do.call("rbind",
   lapply(unique(skulls[["epoch"]]),
          function(x) { 
             coefs <- coef(powerTransform(subset(skulls, epoch == x)[ , 2:5]));
             do.call("cbind", 
               lapply(seq(length(coefs)),
                function(y) bct(subset(skulls, epoch == x)[ , (y+1)], coefs[y])))

          }
    )
)
于 2012-10-01T13:35:25.450 回答