我正在运行一个函数来对数据帧的多个子集执行加权双样本 t 检验。我的代码的可重现版本(使用 mtcars 数据集)如下:
library(tidyverse)
library(weights)
df_list <- split(mtcars, mtcars$carb)
multiple_wt_ttest <- function(df) {ttest = wtd.t.test(x=subset(df, am == 0)$disp,y=subset(df, am == 1)$disp,
weight=subset(df, am == 0)$wt,weighty=subset(df, am == 1)$wt,samedata=FALSE)
out <<- ttest[2]}
store <- do.call(rbind, sapply(df_list, multiple_wt_ttest))
这会生成一个数据框,显示基于变量 carb
的 mtcar 每个子集所需的 t 检验。现在,我想重复一遍,不仅仅是为了比较变量 disp
但对于数据框中的多个变量(在 mtcars 中,例如 drat
、 cyl
、 gear
等。因此,公式如下所示:
library(tidyverse)
library(weights)
df_list <- split(mtcars, mtcars$carb)
var_list <- list("cyl","drat","disp")
multiple_wt_ttest <- function(df,var) {ttest = wtd.t.test(x=subset(df, am == 0)$var,y=subset(df, am == 1)$var,
weight=subset(df, am == 0)$wt,weighty=subset(df, am == 1)$wt,samedata=FALSE)
out <<- ttest[2]}
store <- do.call(rbind, sapply(df_list,var=var_list, multiple_wt_ttest))
但这不起作用并会产生错误:
Error in var(x) : 'x' is NULL
我认为这与原来的sapply
有关。正在提供一个数据框,而新的 var_list
是变量向量/列表。那么我如何在我的 sapply
中组合 2 个不同的输入函数对每个数据子集、多个变量(而不是只有一个)重复此 t 检验过程,并将结果并排编译在表中?
最佳答案
这是一个解决方案。
首先,我修正了该函数,使其能够处理只有一个 am
值的输入 data.frame,例如只有一行的数据。
然后,在变量列表上的 lapply
循环中调用为一个变量运行的代码。
library(weights)
#> Loading required package: Hmisc
#>
#> Attaching package: 'Hmisc'
#> The following objects are masked from 'package:base':
#>
#> format.pval, units
multiple_wt_ttest <- function(df, target_var) {
i0 <- df$am == 0
i1 <- df$am == 1
if(any(i0) && any(i1)) {
ttest <- wtd.t.test(
x = df[[target_var]][i0],
y = df[[target_var]][i1],
weight = df$wt[i0],
weighty = df$wt[i1],
samedata = FALSE
)
ttest[[2]]
} else NULL
}
df_list <- split(mtcars, mtcars$carb)
var_list <- list("cyl","drat","disp")
results_list <- lapply(var_list, \(v) {
store <- do.call(rbind, sapply(df_list, multiple_wt_ttest, target_var = v))
store <- as.data.frame(store)
store$variable <- v
store[c(4, 1:3)]
})
do.call(rbind, results_list)
#> variable t.value df p.value
#> 1 cyl 2.327192 2.000000 0.145420369
#> 2 cyl 3.351162 5.000000 0.020303028
#> 4 cyl 1.068365 3.070500 0.362061152
#> 11 drat -3.335558 2.345842 0.063563101
#> 21 drat -3.633611 6.293180 0.010048620
#> 41 drat -3.455307 7.778648 0.009008048
#> 12 disp 3.069880 2.183101 0.082230383
#> 22 disp 3.897422 5.560369 0.009295961
#> 42 disp 1.697305 4.282223 0.160142699
创建于 2023 年 5 月 26 日 reprex v2.0.2
关于使用 2 个输入(变量和数据帧)运行 sapply 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76337436/