微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 mapply() 扩展 lapply() 函数以使用两个列表

如何解决使用 mapply() 扩展 lapply() 函数以使用两个列表

我希望创建自己的 Cohen 的 D 函数。我已经设置它目前可以通过单个变量比较所有组。我想扩展它,以便我可以在一个数据框中一次测试多个变量。

数据

n <-50
dat <- data.frame(group=rep(LETTERS[1:4],n/2),test1=rnorm(n),test2=rnorm(n),test3=rnorm(n))

在组列表上工作 lapply() 函数,我想扩展它以生成一个 3x3 数据框,其中 Tests1-3 作为行:

grouplist <- c("B","C","D")

cohensD <- do.call(rbind.data.frame,lapply(grouplist,function(i){
                                 m1<- mean(dat$test1[dat$group==i],na.rm = T)
                                 m2 <- mean(dat$test1[dat$group=="A"],na.rm = T) #ref group
                                 s1 <- sd(dat$test1[dat$group==i],na.rm = T)
                                 s2 <- sd(dat$test1[dat$group=="A"],na.rm = T)
                                 n1 <- length(dat$test1[dat$group==i])
                                 n2 <- length(dat$test1[dat$group=="A"])
                                 lx <- n1- 1
                                 ly <- n2- 1
                                 md  <- m1-m2        ## mean difference (numerator)
                                 csd <- lx * s1^2 + ly * s2^2
                                 csd <- csd/(lx + ly)
                                 csd <- sqrt(csd)                     ## common sd computation
                                 
                                 cd  <- md/csd;                        ## cohen's d
                                 return(cd)}))
colnames(cohensD) <- c("cohensD")
cohensD

所需的输出

  group      test1      test2      test3
1     B -0.2383797 -0.9938493  1.4751939
2     C -0.1994608 -2.0286277 -0.5582137
3     D -0.6156380  1.0020181  0.2030028

我知道 mapply() 可以解决这个问题,但我无法让它按预期工作。我可能会做一系列的 for 循环,但试图坚持 apply() 系列。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。