使用索引在数据帧上创建 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))
所以,假设我有一个 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))