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

ivqmmu1c  于 2023-05-26  发布在  其他
关注(0)|答案(1)|浏览(117)

我正在运行一个函数来对 Dataframe 的多个子集执行加权双样本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))

这产生了一个 Dataframe ,显示了基于变量carb的mtcar的每个子集的期望t检验。现在,我想重复这一点,不仅仅是为了比较变量disp,而是为了比较 Dataframe 中的多个变量(例如,在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提供了一个 Dataframe 的事实有关,而新的var_list是一个向量/变量列表。那么,我如何在sapply函数中合并2个不同的输入,对多个变量(而不是一个变量)的每个数据子集重复这个t检验过程,并在一个表中相邻编译结果?

afdcj2ne

afdcj2ne1#

这里有一个解决方案。
首先,我已经更正了函数,以便它可以科普输入数据。只有一个am值的帧,例如只有一行的数据。
然后,在变量列表中调用为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-05-26带有reprex v2.0.2

相关问题