用户定义的函数,用于在两个数据集之间进行t检验

时间:2016-01-03 19:16:02

标签: r user-defined-functions lapply

我是一位试图找出lapply的新用户。

我有两个数据集,每个数据集中有30个相同的变量,我正在尝试运行t检验来比较每个样本中的变量。我理想的结果是一个表格,列出每个变量以及t stat和两个数据集之间变量差异的p值。

我尝试设计一个函数来进行t检验,这样我就可以使用lapply。这是我的代码,带有可重复的示例。

height<-c(2,3,4,2,3,4,5,6)
weight<-c(3,4,5,7,8,9,5,6)
location<-c(0,1,1,1,0,0,0,1)
data_test<-cbind(height,weight,location)
data_north<-subset(data_test,location==0)
data_south<-subset(data_test,location==1)
variables<-colnames(data_test)
compare_t_tests<-function(x){
  model<-t.test(data_south[[x]], data_north[[x]], na.rm=TRUE)
  return(summary(model[["t"]]), summary(model[["p-value"]]))
}
compare_t_tests(height)

得到错误:

Error in data_south[[x]] : attempt to select more than one element 

我计划在lapply中使用这个功能,一旦我搞清楚了。

 lapply(variables, compare_t_tests)

我真的很感激任何建议。在我看来,我甚至可能都没有看到这个权利,所以也欢迎重定向!

1 个答案:

答案 0 :(得分:4)

你非常接近。只有一些调整:

数据:

height <- c(2,3,4,2,3,4,5,6)
weight <- c(3,4,5,7,8,9,5,6)
location <- c(0,1,1,1,0,0,0,1)

使用data.frame代替cbind来获取具有真实姓名的数据框...

data_test <- data.frame(height,weight,location)
data_north <- subset(data_test,location==0)
data_south <- subset(data_test,location==1)

不要在变量集中包含location ...

variables <- colnames(data_test)[1:2] ## skip location

使用模型,而不是摘要;返回一个向量

compare_t_tests<-function(x){
   model <- t.test(data_south[[x]], data_north[[x]], na.rm=TRUE)
   unlist(model[c("statistic","p.value")])
}

与引号中的变量比较,而不是原始符号:

compare_t_tests("height")
## statistic.t     p.value 
##   0.2335497   0.8236578 

使用sapply会自动将结果合并到一个表格中:

sapply(variables,compare_t_tests)
##                height     weight
## statistic.t 0.2335497 -0.4931970
## p.value     0.8236578  0.6462352

如果您愿意,可以将此转置(t())...