使用 2 个输入(变量和数据帧)运行 sapply 函数

标签 r function sapply

我正在运行一个函数来对数据帧的多个子集执行加权双样本 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 中,例如 dratcylgear 等。因此,公式如下所示:

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/

相关文章:

r - 查看列表中的哪个向量包含在另一个列表中的向量中(查找人员姓名匹配)

根据条件使用上一行替换值(使用 sapply 等函数)

r - 如何根据列中的级别对重复值求和并输出计数表?

R:在大数据框的行中有效地grep字符

r - 如何在R中创建列的md5哈希?

javascript - 在调用函数之前执行 Greasemonkey 脚本中的代码

python - 尝试根据与数据框相关的 if 语句在 Pandas 中创建新的数据框列

C函数输入字符串

r - ggplot sec_axis 我可以使用向量作为反式公式吗?

R:如何按行对矩阵中的对求和?