#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))
Эти две части кода дают эквивалентные ответы (но с разной обработкой пропущенных значений).