【问题标题】:Create subsets from a dataframe by a combination of factors通过组合因素从数据框创建子集
【发布时间】: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 新手,希望有一种简单的方法来完成这项任务。非常感谢!

【问题讨论】:

标签: r list dataframe loops apply


【解决方案1】:

combn 接受一个函数,因此您可以对函数本身的每个组合执行t.test。使用sapply,您可以对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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多