将函数应用于R中多个数据帧的每个单元格

时间:2016-08-18 17:27:05

标签: r dataframe

假设我有N个相同(相同数量的行和列)数据帧:

set.seed(2)
df1 <- data.frame(replicate(100,rnorm(100)))
df2 <- data.frame(replicate(100,rnorm(100)))
dfN <- data.frame(replicate(100,rnorm(100)))

我想在N个数据帧的每个“单元”的中应用一个函数(在本例中为t.test()),这样返回的是一个单独的数据帧,其中包含每个单元格的值进行测试。基本上,我想采用每个数据帧的第一个单元格,

one <- df1[1,1]
two <- df2[1,1]
Nth <- dfN[1,1]

对这些单元格执行t.test()

first.cell.each <- cbind.data.frame(one,two,Nth)
t.test(first.cell.each, mu=0)

并在所有单元格中重复(在这种情况下为10000)。

编辑:澄清

2 个答案:

答案 0 :(得分:2)

我们可以创建matrix来存储p.value t.test的输出,其具有与各个数据集相同的维度。然后,循环遍历行和列的序列,从每个数据集中提取元素,连接并执行t.test并将输出分配给&#39; res&#39;的相同行/列索引。

res <- matrix(, ncol=100, nrow=100)
for(i in seq_len(nrow(df1))){
 for(j in seq_len(ncol(df1))){
  res[i,j] <- t.test(c(df1[i,j], df2[i,j], dfN[i,j]), mu = 0)$p.value

 }}

我的代码也返回100 * 100矩阵

str(res)
#num [1:100, 1:100] 0.629 0.5 0.131 0.769 0.348 ...

如果有很多数据集,我们可以将其放在list中,然后将其转换为array并使用t.test

进行apply
lst <-  mget(paste0("df", c(1, 2, "N")))
ar1 <- array(unlist(lst), dim = c(dim(df1), length(lst)))
res2 <-  apply(aperm(ar1, c(3, 1, 2)), c(2,3), FUN = function(x) t.test(x, mu = 0)$p.value) 
str(res2)
# num [1:100, 1:100] 0.629 0.5 0.131 0.769 0.348 ...

答案 1 :(得分:1)

假设您已将所有数据框保存在列表z <- matrix(tapply(unlist(datlst, use.names = FALSE), rep(gl(prod(dim(datlst[[1]])), 1), length(datlst)), FUN = function (u) t.test(u, mu = 0)$p.value), nrow = nrow(datlst[[1]])) 中,这可以完成工作

datlst <- list(df1, df2, dfN)

使用示例数据框str(z) # num [1:100, 1:100] 0.629 0.5 0.131 0.769 0.348 ... ,我的代码成功返回100 * 100矩阵:

{    font-family: arial, sans-serif;
    border-collapse: collapse;
    width: 100%;
}

td, th, tr{
    border: 1px solid #dddddd;
    text-align: left;
    padding: 10px;
}


@media only screen and (max-width: 460px) {


 /* Force table to not be like tables anymore  */
	table, th, tbody, td, thead { 
		display: block; 
		width: 100%;
	}
  
#content {
	

	}
  
 }