我有管道格式的代码来转换数据帧,并且无法计算平均值和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)
答案 0 :(得分:3)
我们可以使用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())))
答案 1 :(得分:1)
问题在于您说的是,计算平均值之后,关于舞台的信息就消失了。这是因为您用平均值覆盖了原始列(即使用相同的名称)。 您可以通过以下方法解决此问题:首先计算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
如果您想将数据转换为长格式,另一种方法可能是先转换它们,然后计算均值和SE:
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