R как суммировать 2 измерения из одной и той же экспериментальной единицы в разные даты - PullRequest
1 голос
/ 28 июня 2019

У меня есть база данных по набору кораллов в экспериментальные подразделения или модули.Во время одной из моих переписей мне пришлось начинать и завершать переписи рекрутов в разные дни для северной (N) стороны модуля 114. Мне нужно суммировать количество рекрутов для этих экземпляров, используя в качестве даты дату последнего наблюдения.В случае строк 1 и 2, я хочу, чтобы дата для объединенной строки была 2017-08-20.

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

n3 <- structure(list(`Module #` = structure(c(4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L), .Label = c("111", "112", 
"113", "114", "115", "116", "211", "212", "213", "214", "215", 
"216"), class = "factor"), Side = structure(c(1L, 1L, 1L, 1L, 
1L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L), .Label = c("N", 
"S", "T"), class = "factor"), TimeStep = c(4L, 4L, 5L, 6L, 7L, 
4L, 4L, 5L, 6L, 7L, 4L, 4L, 5L, 6L, 7L), Date = structure(c(17389, 
17398, 17482, 17601, NA, 17389, 17404, NA, 17601, 17682, 17389, 
17404, NA, 17601, NA), class = "Date"), Year = structure(c(1L, 
1L, 1L, 2L, 2L, 1L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 2L, 2L), .Label = c("17", 
"18"), class = "factor"), Site = structure(c(2L, 2L, 2L, 2L, 
NA, 2L, 2L, NA, 2L, 2L, 2L, 2L, NA, 2L, NA), .Label = c("HAN", 
"WAI"), class = "factor"), Treatment = c("CLO", "CLO", "CLO", 
"CLO", NA, "CLO", "CLO", NA, "CLO", "CLO", "CLO", "CLO", NA, 
"CLO", NA), recruits = c(5, 1, 2, 1, 0, 4, 1, 0, 2, 4, 1, 1, 
0, 1, 0), Site_long = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("Hanauma Bay", "Waikiki"
), class = "factor"), Shelter = structure(c(2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("High", "Low"
), class = "factor")), row.names = c(NA, -15L), class = "data.frame")

Мой вывод должен быть 12 строк путем объединения строк 1-2, 6-7и 11-12.Спасибо за ваш вклад!

Ответы [ 2 ]

1 голос
/ 28 июня 2019

Мы можем использовать data.table методы. Преобразуйте «data.frame» в «data.table» (setDT(n3)), сгруппированный по «Module #», «Side», «TimeStep», получите max из «Date» и sum из «призывников» ', обновите эти столбцы и получите строки unique по этим групповым переменным

library(data.table)
unique(setDT(n3)[,  c("Date", "recruits") :=  list(max(Date, 
  na.rm = TRUE),  sum(recruits)), .(`Module #`, Side, TimeStep)],
         by = c("Module #", "Side", "TimeStep"))
#  Module # Side TimeStep       Date Year Site Treatment recruits Site_long Shelter
# 1:      114    N        4 2017-08-20   17  WAI       CLO       24   Waikiki     Low
# 2:      114    N        5 2017-11-12   17  WAI       CLO        2   Waikiki     Low
# 3:      114    N        6 2018-03-11   18  WAI       CLO        1   Waikiki     Low
# 4:      114    N        7       <NA>   18 <NA>      <NA>        0   Waikiki     Low
# 5:      114    S        4 2017-08-26   17  WAI       CLO       20   Waikiki     Low
# 6:      114    S        5       <NA>   17 <NA>      <NA>        0   Waikiki     Low
# 7:      114    S        6 2018-03-11   18  WAI       CLO        2   Waikiki     Low
# 8:      114    S        7 2018-05-31   18  WAI       CLO        4   Waikiki     Low
# 9:      114    T        4 2017-08-26   17  WAI       CLO        8   Waikiki     Low
#10:      114    T        5       <NA>   17 <NA>      <NA>        0   Waikiki     Low
#11:      114    T        6 2018-03-11   18  WAI       CLO        1   Waikiki     Low
#12:      114    T        7       <NA>   18 <NA>      <NA>        0   Waikiki     Low

Или, используя tidyverse, мы arrange по первым 4 столбцам, сгруппированным по 'Module #', 'Side', 'TimeStep', mutate, чтобы получить sum из 'призывников' и slice последний ряд

library(tidyverse)
n3 %>%
   arrange_at(1:4) %>% 
   group_by_at(1:3) %>% 
   mutate(recruits = sum(recruits)) %>%
   slice(n())
# A tibble: 12 x 10
# Groups:   Module #, Side, TimeStep [12]
#   `Module #` Side  TimeStep Date       Year  Site  Treatment recruits Site_long Shelter
#   <fct>      <fct>    <int> <date>     <fct> <fct> <chr>        <dbl> <fct>     <fct>  
# 1 114        N            4 2017-08-20 17    WAI   CLO              6 Waikiki   Low    
# 2 114        N            5 2017-11-12 17    WAI   CLO              2 Waikiki   Low    
# 3 114        N            6 2018-03-11 18    WAI   CLO              1 Waikiki   Low    
# 4 114        N            7 NA         18    <NA>  <NA>             0 Waikiki   Low    
# 5 114        S            4 2017-08-26 17    WAI   CLO              5 Waikiki   Low    
# 6 114        S            5 NA         17    <NA>  <NA>             0 Waikiki   Low    
# 7 114        S            6 2018-03-11 18    WAI   CLO              2 Waikiki   Low    
# 8 114        S            7 2018-05-31 18    WAI   CLO              4 Waikiki   Low    
# 9 114        T            4 2017-08-26 17    WAI   CLO              2 Waikiki   Low    
#10 114        T            5 NA         17    <NA>  <NA>             0 Waikiki   Low    
#11 114        T            6 2018-03-11 18    WAI   CLO              1 Waikiki   Low    
#12 114        T            7 NA         18    <NA>  <NA>             0 Waikiki   Low    
1 голос
/ 28 июня 2019

Получите максимальное Date значение и sum новобранцев в каждой группе и выберите только 1 строку из каждой из них.

library(dplyr)

n3 %>%
  group_by(`Module #`, Side, TimeStep) %>%
  mutate(Date = max(Date, na.rm = TRUE), 
         recruits = sum(recruits)) %>%
  slice(1)

# `Module #` Side  TimeStep Date       Year  Site  Treatment recruits Site_long Shelter
#   <fct>      <fct>    <int> <date>     <fct> <fct> <chr>        <dbl> <fct>     <fct>  
# 1 114        N            4 2017-08-20 17    WAI   CLO              6 Waikiki   Low    
# 2 114        N            5 2017-11-12 17    WAI   CLO              2 Waikiki   Low    
# 3 114        N            6 2018-03-11 18    WAI   CLO              1 Waikiki   Low    
# 4 114        N            7 NA         18    NA    NA               0 Waikiki   Low    
# 5 114        S            4 2017-08-26 17    WAI   CLO              5 Waikiki   Low    
# 6 114        S            5 NA         17    NA    NA               0 Waikiki   Low    
# 7 114        S            6 2018-03-11 18    WAI   CLO              2 Waikiki   Low    
# 8 114        S            7 2018-05-31 18    WAI   CLO              4 Waikiki   Low    
# 9 114        T            4 2017-08-26 17    WAI   CLO              2 Waikiki   Low    
#10 114        T            5 NA         17    NA    NA               0 Waikiki   Low    
#11 114        T            6 2018-03-11 18    WAI   CLO              1 Waikiki   Low    
#12 114        T            7 NA         18    NA    NA               0 Waikiki   Low    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...