R трубопроводов: выполнить одновременно - PullRequest
0 голосов
/ 27 августа 2018

У меня есть код в конвейерном формате для преобразования кадра данных, и я застрял с вычислением среднего и SE. Я могу сделать только один из них, потому что функции выполняются последовательно (конечно). Мне нужен способ сделать это одновременно (или, по крайней мере, позволить им обоим работать с одним и тем же промежуточным объектом).

Ситуация

У меня есть 6 различных обработок, с 4 повторностями каждая, и x = количество ошибок в 3 различных жизненных циклах.

Необработанные данные организованы таким образом, что подсчет каждой продолжительности жизни является различной переменной. Я переупорядочиваю это в кадре данных с переменной «count» и переменной «lifestage» для создания графиков с ggplot2.

Прежде чем переупорядочить переменные, я рассчитываю среднее значение из 4 повторностей для каждой обработки на каждом временном шаге. Теперь мне также нужен SE, но эта часть не работает. Если я только вычисляю SE, это работает. Но поскольку я ПЕРВЫЙ вычисляю среднее значение, информация о четырех повторностях исчезла, и я больше не могу вычислить 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 голосов
/ 27 августа 2018

Проблема в том, что вы сказали, что информация о стадии исчезла после того, как вы вычислили среднее значение. Это потому, что вы перезаписываете исходный столбец со средним значением (то есть даете то же имя). Вы можете решить эту проблему, сначала вычислив 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
0 голосов
/ 27 августа 2018

Мы можем использовать 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())))
...