将参数作为两个列表(一个公式,一个向量)进行映射

时间:2014-01-12 22:39:12

标签: r mapply

我正在尝试使用mapplyt.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"

1 个答案:

答案 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)