Неожиданный вывод dply (). Не группируется по желанию

#r #dplyr #plyr #demographics

Вопрос:

Я новичок в R, использую его для анализа некоторых демографических данных для вида растений. Мой фрейм данных состоит из:

TagKey (уникальный идентификатор), Год (год наблюдения), установленный тег (год, когда растение было впервые найдено) и класс стадий (0=мертвый, 1=саженец, 2=вегетативный, 3=репродуктивный). Существует строка для каждого года, когда завод посещался, но мне нужна 1 строка для каждого завода, а затем столбцы для его статуса каждый год. Это делается для того, чтобы отслеживать статус человека из года в год.

примеры данных:

 TagKey lt;- c(PDPLM040J0_ALIFOR01_Belt_0, PDPLM040J0_ALIFOR01_Belt_0, PDPLM040J0_ALIFOR01_Belt_0, PDPLM040J0_ALIFOR01_Belt_1, PDPLM040J0_ALIFOR01_Belt_1, PDPLM040J0_ALIFOR01_Belt_1) Year lt;- c(2020, 2020, 2020, 2021, 2021, 2021) TagEstablished lt;- c(2020, 2020, 2020, 2020, 2020, 2020) StageClass lt;- c(1, 2, 3, 0, 3, 3)  ALFO_stages lt;- data.frame(TagKey, Year, TagEstablished, StageClass)  

Я пробовал использовать ddply:

 ALFO_status lt;- ddply(ALFO_stages, .(TagKey), dplyr::summarize,  Year_Established = TagEstablished,  Status2020 = if(Year=="2020") {StageClass},  Status2021 = if(Year=="2021") {StageClass})  

Мои выходные данные не группируются по тегу, как хотелось бы. Результаты верны для соответствующих лет, но неприменимые годы просто выплевывают NAs. Помочь?

Комментарии:

1. Несколько комментариев: Пожалуйста, попробуйте использовать dput для получения ваших выборочных данных и предоставьте R-код, который выдает эти выборочные данные. Во-вторых, plyr ушел на пенсию, так что сейчас не самое лучшее этим заниматься. dplyr является действующим стандартом. В-третьих, что именно вы хотите сделать?

2. Спасибо вам за ваш вклад. Саймон.С.А решил мою проблему ниже.

Ответ №1:

На основе этого предложения: «Есть строка за каждый год, когда завод посещался, но я хочу 1 строку на завод, а затем столбцы за его статус каждый год». Похоже, вы хотите изменить или развернуть свои данные.

«Группировка по» , как правило, является частью обобщения данных. Например, подсчет количества записей в год, предполагает группировку по годам. Поворот или изменение формы-это процесс преобразования содержимого столбца в метки столбцов или наоборот.

В R я бы рекомендовал этот tidyr пакет. Возможно, что-то вроде:

 TagKey lt;- c("PDPLM040J0_ALIFOR01_Belt_0", "PDPLM040J0_ALIFOR01_Belt_0", "PDPLM040J0_ALIFOR01_Belt_0", "PDPLM040J0_ALIFOR01_Belt_1", "PDPLM040J0_ALIFOR01_Belt_1", "PDPLM040J0_ALIFOR01_Belt_1") Year lt;- c(2018, 2019, 2020, 2019, 2020, 2021) # NOTE editted for unique year for each tree TagEstablished lt;- c(2020, 2020, 2020, 2020, 2020, 2020) StageClass lt;- c(1, 2, 3, 0, 3, 3)  ALFO_stages lt;- data.frame(TagKey, Year, TagEstablished, StageClass)  library(tidyr) library(dplyr)  ALFO_stages %gt;% pivot_wider(id_cols = c(TagKey, TagEstablished), names_from = Year, values_from = StageClass)  

Это приводит к:

 TagKey TagEstablished `2018` `2019` `2020` `2021`  lt;chrgt; lt;dblgt; lt;dblgt; lt;dblgt; lt;dblgt; lt;dblgt; 1 PDPLM040J0_ALIFOR01_Belt_0 2020 1 2 3 NA 2 PDPLM040J0_ALIFOR01_Belt_1 2020 NA 0 3 3  

В качестве альтернативы вы можете сделать это вручную, используя множество ifelse инструкций:

 ALFO_stages %gt;%  group_by(TagKey, TagEstablished) %gt;%  summarise(y2018 = max(ifelse(Year == 2018, StageClass, NA), na.rm = TRUE),  y2019 = max(ifelse(Year == 2019, StageClass, NA), na.rm = TRUE),  y2020 = max(ifelse(Year == 2020, StageClass, NA), na.rm = TRUE),  y2021 = max(ifelse(Year == 2021, StageClass, NA), na.rm = TRUE))  

Эти две части кода дают эквивалентные ответы (но с разной обработкой пропущенных значений).