假设我有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)。
编辑:澄清
答案 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 {
}
}