繁体   English   中英

通过组合因素从数据帧创建子集

[英]Create subsets from a dataframe by a combination of factors

我需要在大型数据集上按列进行成对的迭代分析。 第一列包含分类变量和其余数值。 例如,对于数据帧 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 的新手,希望有一种直接的方法来完成这项任务。 非常感谢!

combn接受一个函数,因此您可以对函数本身中的每个组合执行t.test 使用sapply您可以对ls2每一列执行此ls2

sapply(ls2, function(y) combn(c("a", "b", "c"), 2, function(x) {
  data.x <- subset(df, T %in% x)
  t.test(reformulate('T', y), data = data.x, var.equal = TRUE)[["p.value"]]
}))

 #         G      H      I
#[1,] 0.0155 0.1599 0.0434
#[2,] 0.0086 0.0383 0.0282
#[3,] 0.6681 0.0804 0.5531

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM