【发布时间】:2021-01-26 08:13:40
【问题描述】:
我需要在大型数据集上按列进行成对的迭代分析。第一列包含分类变量,其余为数值。例如,对于数据帧 df:
df <- data.frame(T = c("a", "a", "b", "b", "c", "c"), G = c(1.1, 2.3, 7.4, 8.4, 8.1, 8.2), H = c(2.4, 1.3, 3.1, 4.5, 9.6, 7.2), I = c(2.5, 1.1, 7.2, 9.7, 10.8, 8.5))
我需要对所有 a/b/c 组合的 V2、V3、V4 进行 t 检验。我创建了两个列表:
ls1 = combn(c("a", "b", "c"), 2)
ls2 = colnames(df[2:ncol(df)])
并使用它们来创建子数据集
pair <- function(x) {data.x <- df %>% filter(T %in% x)}
df_sets <- apply(ls1, MARGIN = 2, pair)
然后我可以将每个子数据集用于对每一列进行 t 检验并通过以下方式检索 p 值
data1 <- as.data.frame(df_sets[[1]])
ttest_p_by_col <- function(y) {(t.test(get(y)~T, data = data1, var.equal = T))[["p.value"]]}
p_t_tab <- unlist(lapply(ls2, ttest_p_by_col))
并使用 data2、data3 重复最后一个过程。然而,在实际情况下,我的数据集比 a/b/c 长得多,这使得手动重复这个过程很费力。我尝试使用循环自动化 as.data.frame(df_sets[[i]]) 部分
for(i in 1:ncol(ls1)) {data[i] <- as.data.frame(df_sets[[ [i] ]])}
但显然我不能在 [[ ]] 中包含 [i]。如何从 df_sets 列表中获取子数据集作为单独的数据帧?或者有没有更好的方法通过 apply() 创建子集以避免从列表中检索它们?我也尝试直接使用循环创建子数据集
for(i in 1:ncol(ls1)) {data[i] <- df %>% filter(T %in% ls1[,i])}
但是遇到了在 filter() 中使用 [] 的问题。我是 R 新手,希望有一种简单的方法来完成这项任务。非常感谢!
【问题讨论】:
-
欢迎堆栈溢出。看起来你可能想多了 - 这是谷歌不得不说的:datanovia.com/en/blog/…
标签: r list dataframe loops apply