将函数应用于R中多个数据帧中的每个单元格
假设我有N个相同(行数和列数相同)的数据帧:将函数应用于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
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 ...