我正在尝试使用mapply
将t.test
应用于两个参数列表。第一个列表formulas
包含三个公式,第二个列表periods
包含三个向量my.data
的向量,我使用MoreArgs
参数传递。
我可以使用t.test
循环(也在下面)手动执行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"
答案 0 :(得分:1)
如果您根据period
拆分data.frame,则不需要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)