使用索引在数据帧上创建 t 测试循环

Creating a t-test loop over a dataframe using an index

所以,假设我有一个 1000 行、6 列的数据框,列是 a1、a2、b1、b2、c1、c2。我想 运行 使用 a、b 和 c 进行一些 t 检验,并得到一个输出 df,其中 3 列用于 a-b-c 的 t 值,另外三列用于这些值的显着性信息,使其总共为6 列。我遇到的问题是行,我想遍历 20 个块,将输出渲染为 (1000/20=)50 行,6 列 df.

我已经尝试为我的初始 df 创建一个索引列,它在前 20 行重复 1,在接下来的 20 行重复 2,依此类推。

    convert_n <- function(df) {
    df <- df %T>% {.$n_for_t_tests = rep(c(1:(nrow(df)/20)), each = 20)}
    }
    df <- convert_n(df)

但是,我似乎无法找到一种方法来正确利用此列中的项目作为 "for" 或任何类型循环的索引。

您可以在下面看到创建 1 行 6 列 df 的相关代码;我需要修改 [0:20] 部分,创建一个循环,为 20 个组执行此操作并绑定它们。

    t_test_a <- t.test(df$a1[0:20], dfff$a2[0:20], paired = T, conf.level 
    = 0.95)
    t_test_b <- t.test(df$b1[0:20], dfff$b2[0:20], paired = T, conf.level 
    = 0.95)
    t_test_c <- t.test(df$c1[0:20], dfff$c2[0:20], paired = T, conf.level 
    = 0.95)
    t_tests_df <- data.frame(t_a = t_test_a$statistic[["t"]], 
                             t_b = t_test_b$statistic[["t"]],
                             t_c = t_test_c$statistic[["t"]])

    t_tests_df <- t_tests_df %T>% {.$dif_significance_a = ifelse(.$t_a > 
                                   2, "YES", "NO")} %T>% 
                                  {.$dif_significance_b = ifelse(.$t_b > 
                                   2, "YES", "NO")} %T>% 
                                  {.$dif_significance_c = ifelse(.$t_c > 
                                   2, "YES", "NO")} %>% 
                                  dplyr::select(t_a, dif_significance_a, 
                                                t_b, dif_significance_b,
                                                t_c, dif_significance_c)

预先感谢您的帮助。

这不是最漂亮的,但我做了一个这样的 for 循环:

df <- data.frame(a1 = sample(1000, 1000),
                 a2 = sample(1000, 1000),
                 b1 = sample(1000, 1000),
                 b2 = sample(1000, 1000),
                 c1 = sample(1000, 1000),
                 c2 = sample(1000, 1000))


df_ttest <- data.frame(p_a = c(1:50),
                       t_a = c(1:50),
                       p_b = c(1:50),
                       t_b = c(1:50),
                       p_c = c(1:50),
                       t_c = c(1:50))

index <- 0:50*20

for(i in seq_along(index)) {
    df_ttest$p_a[i] =  t.test(df$a1[index[i] : index[i+1]])$p.value
    df_ttest$p_b[i] =  t.test(df$b1[index[i] : index[i+1]])$p.value
    df_ttest$p_c[i] =  t.test(df$c1[index[i] : index[i+1]])$p.value

    df_ttest$t_a[i] =  t.test(df$a1[index[i] : index[i+1]])$statistic
    df_ttest$t_b[i] =  t.test(df$b1[index[i] : index[i+1]])$statistic
    df_ttest$t_c[i] =  t.test(df$c1[index[i] : index[i+1]])$statistic
}

这给出了一个 50x6 的数据帧,对于 a、b 和 c 的每 20 行块,它具有单独的 p 和 t 值列。

您甚至可以更进一步,制作一个嵌套的 for 循环来循环遍历 df_ttest 中的每一行,使这个 abit 更漂亮。

您可以使用 split()sapply():

set.seed(42)

df <- data.frame(a1 = sample(1000, 1000), a2 = sample(1000, 1000),
                 b1 = sample(1000, 1000), b2 = sample(1000, 1000),
                 c1 = sample(1000, 1000), c2 = sample(1000, 1000))

group <- gl(50, 20)

D <- split(df, group)

myt <- function(Di) 
  with(Di, c(at=t.test(a1, a2)$statistic, ap=t.test(a1, a2)$p.value,
    bt=t.test(b1, b2)$statistic, bp=t.test(b1, b2)$p.value,
    ct=t.test(c1, c2)$statistic, cp=t.test(c1, c2)$p.value))

sapply(D, FUN=myt) ### or
t(sapply(D, FUN=myt))