Добавьте элементы в столбце A на основе дат в столбце B и указанных несоответствующих значений в столбце C в R - PullRequest
0 голосов
/ 05 февраля 2019

Я запускаю программу охоты и у меня есть фрейм данных со столбцами: дата, тип вида, усилие и несколько столбцов, которые представляют количество видов, добытых в конкретной охотничьей зоне на эту дату.Однако столбец «видовой вид» разделяет самцов, самок и молоди для одного и того же вида.Мне нужно свернуть данные об урожае одного и того же вида для каждой области, сохраняя при этом всю другую общую информацию.Вот пример моего df:

Date        Species       Area.1.Harvest  Area.2.Harvest   Effort
2016-04-02  Wild Sheep-M        1              NA            30
2016-04-02  Wild Sheep-F        4              NA            30
2016-04-17  Feral Goat-M        NA             5             50
2016-04-17  Feral Goat-F        NA             3             50
2016-09-18  Wild Sheep-M        NA             6             60
2016-09-18  Wild Sheep-F        NA             1             60
2016-09-18  Wild Sheep-J        NA             1             60

Вот результат, который я ищу:

Date        Species       Area.1.Harvest  Area.2.Harvest   Effort
2016-04-02  Wild Sheep          5              NA            30
2016-04-17  Feral Goat          NA             8             50
2016-09-18  Wild Sheep          NA             8             60

У меня есть 6 различных областей, чтобы сделать это для сбора урожая за 3 годаданные.

Ответы [ 3 ]

0 голосов
/ 05 февраля 2019

Вы также можете сделать это довольно легко, используя библиотеку data.table

library(data.table)
df <- data.table(Date = as.Date(c(rep('2016-04-02',2), rep('2016-04-17',2), rep('2016-09-18',3))), Species = c('Wild Sheep-M', 'Wild Sheep-F', 'Feral Goat-M', 'Feral Goat-F', 'Wild Sheep-M', 'Wild Sheep-F','Wild Sheep-J'), Area.1.Harvest = c(1,4,NA,NA,NA,NA,NA), Area.2.Harvest = c(NA,NA,5,3,6,1,1), Effort = c(30, 30, 50, 50, 60, 60, 60))


df[,Species := substr(Species,1,nchar(Species)-2)][,.(Area.1.Harvest = sum(Area.1.Harvest, na.rm=TRUE), 
                                                        Area.2.Harvest = sum(Area.2.Harvest, na.rm=TRUE),
                                                        Effort = mean(Effort, na.rm=TRUE)), by=list(Date, Species)]

#         Date    Species Area.1.Harvest Area.2.Harvest Effort
#1: 2016-04-02 Wild Sheep              5              0     30
#2: 2016-04-17 Feral Goat              0              8     50
#3: 2016-09-18 Wild Sheep              0              8     60
0 голосов
/ 05 февраля 2019

Вы можете сделать следующее, используя только dplyr:

library(dplyr)

df %>%
  group_by(Species = gsub("-.*", "", Species), Date) %>%
  mutate_at(vars(contains("Area")), function(x) sum(x, na.rm = any(!is.na(x))))  %>%
  mutate_at(vars(contains("Effort")), function(x) mean(x, na.rm = any(!is.na(x)))) %>%
  distinct()

Это будет работать независимо от количества переменных Area или Effort, которые у вас есть (так как вы упомянули, что у вас есть несколько и ваши переменныепример - только частичное представление).

Вывод:

# A tibble: 3 x 5
# Groups:   Species, Date [3]
  Date       Species   Area.1.Harvest Area.2.Harvest Effort
  <chr>      <chr>              <int>          <int>  <dbl>
1 2016-04-02 WildSheep              5             NA     30
2 2016-04-17 FeralGoat             NA              8     50
3 2016-09-18 WildSheep             NA              8     60

Пользовательская функция используется для mean и sum, как обычно, например, mean(x, na.rm = T) будет возвращать 0 вместоNA, как указано в желаемом выводе.

0 голосов
/ 05 февраля 2019

Посмотрите на библиотеку dplyr , где функции group_by() и summarise() очень полезны для того типа поиска, который вы ищете.

Посмотрите на библиотеку stringr , где такие функции, как str_sub(), помогают управлять строками и преобразовывать их (в данном случае столбец Species должен символ , а не factor ).

library(dplyr)
library(stringr)

df %>% 
 mutate(
    Species = str_sub(Species, 1, nchar(Species) - 2)
  ) %>% 
  group_by(Date, Species) %>% 
  summarise(
    Area.1.Harvest = sum(Area.1.Harvest, na.rm = T),
    Area.2.Harvest = sum(Area.2.Harvest, na.rm = T),
    Effort         = mean(Effort, na.rm = T)
  )
...