R管道:同时执行

时间:2018-08-27 15:34:55

标签: r dataframe pipeline

我有管道格式的代码来转换数据帧,并且无法计算平均值和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)

2 个答案:

答案 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