在两个列表中包含的data.frames之间执行学生t检验

时间:2017-02-11 22:27:22

标签: r list dataframe t-test

我有两个单独的列表,每个列表包含4个data.frames。我需要在两个列表中的每个data.frames之间为t.test执行学生t检验(rainfall)。

这里是清单:

lst1 = list(data.frame(rnorm(20), rnorm(20)), data.frame(rnorm(25), rnorm(25)), data.frame(rnorm(16), rnorm(16)), data.frame(rnorm(34), rnorm(34)))    
lst1 = lapply(lst1, setNames, c('rainfall', 'snow'))

lst2 = list(data.frame(rnorm(19), rnorm(19)), data.frame(rnorm(38), rnorm(38)), data.frame(rnorm(22), rnorm(22)), data.frame(rnorm(59), rnorm(59)))
lst2 = lapply(lst2, setNames, c('rainfall', 'snow'))

我需要做的是:

t.test(lst1[[1]]$rainfall, lst2[[1]]$rainfall)
t.test(lst1[[2]]$rainfall, lst2[[2]]$rainfall)
t.test(lst1[[3]]$rainfall, lst2[[3]]$rainfall)
t.test(lst1[[4]]$rainfall, lst2[[4]]$rainfall)

我可以通过编写4个data.frames中的每一个来实现它(我实际上有40个实际数据),但我想知道是否存在更聪明,更快捷的方法。

下面我尝试了(没有成功):

myfunction = function(x,y) {
  test = t.test(x, y)
  return(test)
}

result = mapply(myfunction, x=lst1, y=lst2)

2 个答案:

答案 0 :(得分:1)

x <- NULL
for (i in seq_along(lst1)){
  x[[i]] <- t.test(lst1[[i]]$rainfall, lst2[[i]]$rainfall)
}
x

答案 1 :(得分:0)

适合我。我会使用simplify = FALSE来更好地格式化结果。

lst1 <- list()
lst1[[1]] <- data.frame(rainfall = rnorm(10))
lst1[[2]] <- data.frame(rainfall = rnorm(10))
lst2 <- list()
lst2[[1]] <- data.frame(rainfall = rnorm(10))
lst2[[2]] <- data.frame(rainfall = rnorm(10))

myfunction = function(x,y) {
  test = t.test(x$rainfall, y$rainfall)
  return(test)
}

mapply(myfunction, x = lst1, y = lst2, SIMPLIFY = FALSE)