Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将函数应用于R中多个数据帧中的每个单元格_R_Dataframe - Fatal编程技术网

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

将函数应用于R中多个数据帧中的每个单元格,r,dataframe,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))) 对这些单元格执行t.测试() first.cell.each <- cbind.data.frame(one,two,Nth) t.t

假设我有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)))
对这些单元格执行
t.测试()

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

first.cell.each我们可以创建一个
矩阵
来存储
t.test的
p.value
的输出,该输出具有单个数据集的相同维度。然后,循环遍历行和列的序列,从每个数据集中提取元素,连接,并执行
t.test
,并将输出分配给相同的行/列索引'res'

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

 }}

如果有许多数据集,我们可以将其放入
列表
,然后将其转换为
数组
,并使用
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 ...

lst假设您将所有数据帧保存在一个列表中
datlst
,这就完成了工作

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]]))

@哲远里,对不起,我应该说得更清楚。行数和列数相同。您使用了错误的数据结构。将data.frames组合成一个数组并使用apply。现在,您可以使用新的
tidyr
包组合多个数据帧并使用它们的数据。看见
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 ...
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]]))
str(z)
# num [1:100, 1:100] 0.629 0.5 0.131 0.769 0.348 ...