R 管道:同时执行
R pipelines: execute simultaneously
我有管道格式的代码来转换数据帧,但我一直在计算均值和 SE。我只能做其中一个,因为函数是按顺序执行的(当然)。我需要一种方法来同时进行(或者至少让它们都在同一个中间对象上工作)。
情况
我有 6 种不同的处理方法,每种处理有 4 次重复,x = 3 个不同生命阶段的错误计数。
原始数据的组织方式是每个生命阶段的计数是不同的变量。我在带有变量 "count" 和变量 "lifestage" 的数据框中重新排序,以便使用 ggplot2
绘制图表。
在对变量重新排序之前,我计算了每个时间步长每个处理的 4 次重复的平均值。现在我也需要 SE,但这部分不起作用。如果我只计算 SE,它就可以工作。但是因为我先算均值,所以4次重复的信息没有了,我不能再计算SE了。
我知道这当然是管道的全部概念,按顺序做事。但是有没有办法让两件事情同时进行或在上一步的相同中间输出上进行?或者这是不可能的,我是否必须使用完全不同的方法才能同时获得均值和 SE?
代码
# example data
Object <- c(rep("A",10),rep("B",10),rep("C",10),
rep("D",10),rep("E",10),rep("F",10))
Repl <- as.factor(c(rep(1,60),rep(2,60),rep(3,60),rep(4,60)))
Days <- rep(c(0,7,14,21,28,35,42,49,56,63),24)
N1.N3 <- sample(1:10,size=240,replace=T)
N4.N5 <- sample(1:10,size=240,replace=T)
Adult <- sample(1:10,size=240,replace=T)
dfBugs <- data.frame(Object,Repl,Days,N1.N3,N4.N5,Adult)
# calculate mean & SE of Macro counts per object and per date
Bugs <- dfBugs %>%
group_by(Object, Days) %>%
summarise(
count = n(),
N1.N3 = mean(N1.N3, na.rm = TRUE),
N4.N5 = mean(N4.N5, na.rm = TRUE),
Adult = mean(Adult, na.rm = TRUE),
N1.SE = sd(N1.N3, na.rm = TRUE)/sqrt(count),
N4.SE = sd(N4.N5, na.rm = TRUE)/sqrt(count),
Ad.SE = sd(Adult, na.rm = TRUE)/sqrt(count)
)
# put counts of different life stages in 1 column
Bugs <- Bugs %>%
gather(Stage,Counts,-Days,-Object,-count)
我们可以使用 summarise_at
并指定要在 funs
内执行的函数
dfBugs %>%
group_by(Object, Days) %>%
summarise_at(vars(N1.N3:Adult), funs(mean = mean(., na.rm = TRUE),
SE = sd(., na.rm = TRUE)/sqrt(n())))
问题如你所说,计算均值后阶段的信息没有了。这是因为您用平均值覆盖了原始列(即给出相同的名称)。
您可以通过先计算 SE 然后计算平均值或以不同方式命名平均值来解决此问题。
顺序不同:
dfBugs %>%
group_by(Object, Days) %>%
summarise(
count = n(),
N1.SE = sd(N1.N3, na.rm = TRUE)/sqrt(count),
N4.SE = sd(N4.N5, na.rm = TRUE)/sqrt(count),
Ad.SE = sd(Adult, na.rm = TRUE)/sqrt(count),
N1.N3 = mean(N1.N3, na.rm = TRUE),
N4.N5 = mean(N4.N5, na.rm = TRUE),
Adult = mean(Adult, na.rm = TRUE))
# A tibble: 60 x 9
# Groups: Object [?]
# Object Days count N1.SE N4.SE Ad.SE N1.N3 N4.N5 Adult
# <fct> <dbl> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 A 0 4 2.10 0.707 1.55 5.5 8 5.75
# 2 A 7 4 1.03 1.97 1.89 7.25 5.75 4.5
# 3 A 14 4 1.31 1.94 0.957 3.25 6.5 7.5
# 4 A 21 4 1.32 0.629 0.866 5.5 2.25 5.5
# 5 A 28 4 1.29 1.55 1.89 5 5.5 6.25
# 6 A 35 4 1.55 1.44 1.03 6.5 6.75 4.25
# 7 A 42 4 1.31 1.49 0.707 5.25 5.25 7
# 8 A 49 4 0.866 1.63 1.25 3.5 5 6.25
# 9 A 56 4 1.29 1.44 1.03 4 6.5 6.25
# 10 A 63 4 1.47 1.19 1.60 7 3.5 3.25
# ... with 50 more rows
不同的名字:
dfBugs %>%
group_by(Object, Days) %>%
summarise(
count = n(),
N1.N3.mean = mean(N1.N3, na.rm = TRUE),
N4.N5.mean = mean(N4.N5, na.rm = TRUE),
Adult.mean = mean(Adult, na.rm = TRUE),
N1.SE = sd(N1.N3, na.rm = TRUE)/sqrt(count),
N4.SE = sd(N4.N5, na.rm = TRUE)/sqrt(count),
Ad.SE = sd(Adult, na.rm = TRUE)/sqrt(count))
# A tibble: 60 x 9
# Groups: Object [?]
# Object Days count N1.N3.mean N4.N5.mean Adult.mean N1.SE N4.SE Ad.SE
# <fct> <dbl> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 A 0 4 5.5 8 5.75 2.10 0.707 1.55
# 2 A 7 4 7.25 5.75 4.5 1.03 1.97 1.89
# 3 A 14 4 3.25 6.5 7.5 1.31 1.94 0.957
# 4 A 21 4 5.5 2.25 5.5 1.32 0.629 0.866
# 5 A 28 4 5 5.5 6.25 1.29 1.55 1.89
# 6 A 35 4 6.5 6.75 4.25 1.55 1.44 1.03
# 7 A 42 4 5.25 5.25 7 1.31 1.49 0.707
# 8 A 49 4 3.5 5 6.25 0.866 1.63 1.25
# 9 A 56 4 4 6.5 6.25 1.29 1.44 1.03
# 10 A 63 4 7 3.5 3.25 1.47 1.19 1.60
# ... with 50 more rows
由于您无论如何都想将数据转换为长格式,另一种方法可能是先转换它们,然后计算均值和标准误差:
dfBugs %>%
gather(Stage, Counts, N1.N3, N4.N5, Adult) %>%
group_by(Object, Days, Stage) %>%
summarise(count = n(),
Mean = mean(Counts),
SE = sd(Counts, na.rm = TRUE)/sqrt(count))
# A tibble: 180 x 6
# Groups: Object, Days [?]
# Object Days Stage count Mean SE
# <fct> <dbl> <chr> <int> <dbl> <dbl>
# 1 A 0 Adult 4 5.75 1.55
# 2 A 0 N1.N3 4 5.5 2.10
# 3 A 0 N4.N5 4 8 0.707
# 4 A 7 Adult 4 4.5 1.89
# 5 A 7 N1.N3 4 7.25 1.03
# 6 A 7 N4.N5 4 5.75 1.97
# 7 A 14 Adult 4 7.5 0.957
# 8 A 14 N1.N3 4 3.25 1.31
# 9 A 14 N4.N5 4 6.5 1.94
# 10 A 21 Adult 4 5.5 0.866
# ... with 170 more rows
我有管道格式的代码来转换数据帧,但我一直在计算均值和 SE。我只能做其中一个,因为函数是按顺序执行的(当然)。我需要一种方法来同时进行(或者至少让它们都在同一个中间对象上工作)。
情况
我有 6 种不同的处理方法,每种处理有 4 次重复,x = 3 个不同生命阶段的错误计数。
原始数据的组织方式是每个生命阶段的计数是不同的变量。我在带有变量 "count" 和变量 "lifestage" 的数据框中重新排序,以便使用 ggplot2
绘制图表。
在对变量重新排序之前,我计算了每个时间步长每个处理的 4 次重复的平均值。现在我也需要 SE,但这部分不起作用。如果我只计算 SE,它就可以工作。但是因为我先算均值,所以4次重复的信息没有了,我不能再计算SE了。
我知道这当然是管道的全部概念,按顺序做事。但是有没有办法让两件事情同时进行或在上一步的相同中间输出上进行?或者这是不可能的,我是否必须使用完全不同的方法才能同时获得均值和 SE?
代码
# example data
Object <- c(rep("A",10),rep("B",10),rep("C",10),
rep("D",10),rep("E",10),rep("F",10))
Repl <- as.factor(c(rep(1,60),rep(2,60),rep(3,60),rep(4,60)))
Days <- rep(c(0,7,14,21,28,35,42,49,56,63),24)
N1.N3 <- sample(1:10,size=240,replace=T)
N4.N5 <- sample(1:10,size=240,replace=T)
Adult <- sample(1:10,size=240,replace=T)
dfBugs <- data.frame(Object,Repl,Days,N1.N3,N4.N5,Adult)
# calculate mean & SE of Macro counts per object and per date
Bugs <- dfBugs %>%
group_by(Object, Days) %>%
summarise(
count = n(),
N1.N3 = mean(N1.N3, na.rm = TRUE),
N4.N5 = mean(N4.N5, na.rm = TRUE),
Adult = mean(Adult, na.rm = TRUE),
N1.SE = sd(N1.N3, na.rm = TRUE)/sqrt(count),
N4.SE = sd(N4.N5, na.rm = TRUE)/sqrt(count),
Ad.SE = sd(Adult, na.rm = TRUE)/sqrt(count)
)
# put counts of different life stages in 1 column
Bugs <- Bugs %>%
gather(Stage,Counts,-Days,-Object,-count)
我们可以使用 summarise_at
并指定要在 funs
dfBugs %>%
group_by(Object, Days) %>%
summarise_at(vars(N1.N3:Adult), funs(mean = mean(., na.rm = TRUE),
SE = sd(., na.rm = TRUE)/sqrt(n())))
问题如你所说,计算均值后阶段的信息没有了。这是因为您用平均值覆盖了原始列(即给出相同的名称)。 您可以通过先计算 SE 然后计算平均值或以不同方式命名平均值来解决此问题。
顺序不同:
dfBugs %>%
group_by(Object, Days) %>%
summarise(
count = n(),
N1.SE = sd(N1.N3, na.rm = TRUE)/sqrt(count),
N4.SE = sd(N4.N5, na.rm = TRUE)/sqrt(count),
Ad.SE = sd(Adult, na.rm = TRUE)/sqrt(count),
N1.N3 = mean(N1.N3, na.rm = TRUE),
N4.N5 = mean(N4.N5, na.rm = TRUE),
Adult = mean(Adult, na.rm = TRUE))
# A tibble: 60 x 9
# Groups: Object [?]
# Object Days count N1.SE N4.SE Ad.SE N1.N3 N4.N5 Adult
# <fct> <dbl> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 A 0 4 2.10 0.707 1.55 5.5 8 5.75
# 2 A 7 4 1.03 1.97 1.89 7.25 5.75 4.5
# 3 A 14 4 1.31 1.94 0.957 3.25 6.5 7.5
# 4 A 21 4 1.32 0.629 0.866 5.5 2.25 5.5
# 5 A 28 4 1.29 1.55 1.89 5 5.5 6.25
# 6 A 35 4 1.55 1.44 1.03 6.5 6.75 4.25
# 7 A 42 4 1.31 1.49 0.707 5.25 5.25 7
# 8 A 49 4 0.866 1.63 1.25 3.5 5 6.25
# 9 A 56 4 1.29 1.44 1.03 4 6.5 6.25
# 10 A 63 4 1.47 1.19 1.60 7 3.5 3.25
# ... with 50 more rows
不同的名字:
dfBugs %>%
group_by(Object, Days) %>%
summarise(
count = n(),
N1.N3.mean = mean(N1.N3, na.rm = TRUE),
N4.N5.mean = mean(N4.N5, na.rm = TRUE),
Adult.mean = mean(Adult, na.rm = TRUE),
N1.SE = sd(N1.N3, na.rm = TRUE)/sqrt(count),
N4.SE = sd(N4.N5, na.rm = TRUE)/sqrt(count),
Ad.SE = sd(Adult, na.rm = TRUE)/sqrt(count))
# A tibble: 60 x 9
# Groups: Object [?]
# Object Days count N1.N3.mean N4.N5.mean Adult.mean N1.SE N4.SE Ad.SE
# <fct> <dbl> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 A 0 4 5.5 8 5.75 2.10 0.707 1.55
# 2 A 7 4 7.25 5.75 4.5 1.03 1.97 1.89
# 3 A 14 4 3.25 6.5 7.5 1.31 1.94 0.957
# 4 A 21 4 5.5 2.25 5.5 1.32 0.629 0.866
# 5 A 28 4 5 5.5 6.25 1.29 1.55 1.89
# 6 A 35 4 6.5 6.75 4.25 1.55 1.44 1.03
# 7 A 42 4 5.25 5.25 7 1.31 1.49 0.707
# 8 A 49 4 3.5 5 6.25 0.866 1.63 1.25
# 9 A 56 4 4 6.5 6.25 1.29 1.44 1.03
# 10 A 63 4 7 3.5 3.25 1.47 1.19 1.60
# ... with 50 more rows
由于您无论如何都想将数据转换为长格式,另一种方法可能是先转换它们,然后计算均值和标准误差:
dfBugs %>%
gather(Stage, Counts, N1.N3, N4.N5, Adult) %>%
group_by(Object, Days, Stage) %>%
summarise(count = n(),
Mean = mean(Counts),
SE = sd(Counts, na.rm = TRUE)/sqrt(count))
# A tibble: 180 x 6
# Groups: Object, Days [?]
# Object Days Stage count Mean SE
# <fct> <dbl> <chr> <int> <dbl> <dbl>
# 1 A 0 Adult 4 5.75 1.55
# 2 A 0 N1.N3 4 5.5 2.10
# 3 A 0 N4.N5 4 8 0.707
# 4 A 7 Adult 4 4.5 1.89
# 5 A 7 N1.N3 4 7.25 1.03
# 6 A 7 N4.N5 4 5.75 1.97
# 7 A 14 Adult 4 7.5 0.957
# 8 A 14 N1.N3 4 3.25 1.31
# 9 A 14 N4.N5 4 6.5 1.94
# 10 A 21 Adult 4 5.5 0.866
# ... with 170 more rows