0

我试图用来mapply应用t.test两个参数列表。第一个列表formulas包含三个公式,第二个列表periods包含该子集的三个向量,my.data我将其与MoreArgs参数一起传递。

我可以t.test使用循环手动执行 s for(也在下面),但我不知道为什么我的mapply使用失败了。这不是正确的使用时间mapply吗?

# similar data
my.data <- data.frame(CAR1=rnorm(150),
                      CAR2=rnorm(150),
                      CAR3=rnorm(150),
                      period=rep(1:3, each=50),
                      treated=rep(1:2, times=75)
                      )

# two lists to pass as arguments to `t.test()`
# `subset`
periods <- list(my.data$period == 1,
                my.data$period <= 2,
                my.data$period <= 3
                )
# `formula`
formulas <- list(CAR1 ~ treated,
                 CAR2 ~ treated,
                 CAR3 ~ treated
                 )

# manual solution works
ttests <- list()
for (i in 1:3) {
    ttests[[i]] <- t.test(formulas[[i]], 
                          data=my.data, 
                          subset=periods[[i]]
                          )
}

# but `mapply` fails
ttest <- mapply(FUN=t.test, 
                formula=formulas, 
                subset=periods, 
                MoreArgs=list(data=my.data),
                SIMPLIFY=FALSE
                )

# with error "Error in eval(expr, envir, enclos) : object 'dots' not found"
4

1 回答 1

1

如果您根据 拆分 data.frame period,则不需要该periods对象。

split.my.data <- split(my.data, f = my.data$period)

mapply(FUN = function(x, y) {
  t.test(x, data = y)  
}, x = formulas, y = split.my.data, SIMPLIFY = FALSE)

[[1]]

    Welch Two Sample t-test

data:  CAR1 by treated
t = -0.7051, df = 44.861, p-value = 0.4844
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.9277752  0.4466579
sample estimates:
mean in group 1 mean in group 2 
      0.1650074       0.4055661 


[[2]]
... # output truncated

编辑

如果您想根据除 之外的逻辑运算符对因子进行子集化==,我会像这样创建一个“拆分列表”。

split.my.data <- sapply(periods, FUN = function(x, my.data) my.data[x, ], 
       my.data = my.data, simplify = FALSE)
于 2014-01-12T22:47:35.737 回答