Изменить столбец на основе суммы указанных c строк из другого фрейма данных - PullRequest
0 голосов
/ 12 февраля 2020

Я ищу помощь здесь. У меня есть два кадра данных, df1 и df2. Я хочу добавить дополнительный столбец к df1, основываясь на сумме указанных c строк в df2.

Df1 содержит названия станций. Df2 содержит местоположения, годы и наблюдения в градусах. Я хочу сумму градусов для каждой станции. Эти градусы должны быть суммами определенных c мест для каждого года. Думайте об этом, как «каждая станция должна получить свою сумму градусов, основанную на данных местоположениях, за каждый год». Я надеюсь кодировать только название станции и ее местоположение. Годы в требуемой_процедуре должны включать все годы, указанные в df2.

Неудачный пример и желаемый результат. Я предпочитаю работать в среде Tidyverse.

Всего наилучшего

df1 <- data.frame(station = c("station_A", "station_B"))

df2 <- data.frame(location= c("south", "north", "north", "east", "west"), year = c(2000, 2000, 2001, 2001, 2001), degrees = c(5,3,9,5,2))

degrees_for_each_station <-
  df1%>% 
  mutate (degrees = case_when(
    station == "station_A" ~ if_else(df2$location %in% c("north","south"),
                                            sum(df2$degrees),
                                            NA),
    station == "station_B" ~ if_else(df2$location %in% c("north","east", "west"),
                                            sum(df2$degrees),
                                            NA)))

desired_output <- data.frame(station = c("station_A", "station_A","station_B", "station_B"),
                             year = c(2000, 2001, 2000, 2001),
                             degrees = c(8,9,3,16))```


1 Ответ

0 голосов
/ 12 февраля 2020

Один из способов будет:

library(tidyverse)

df1 %>%
  left_join(
    df2 %>%
      mutate(
        location = case_when(
          location == 'south' ~ 'station_A',
          location %in% c('east', 'west') ~ 'station_B',
          location == 'north' ~ 'station_A, station_B'
          )
      ) %>%
      separate_rows(location, sep = ', ') %>%
      group_by(location, year) %>%
      summarise(degrees = sum(degrees)),
    by = c('station' = 'location')
  )

Вывод:

    station year degrees
1 station_A 2000       8
2 station_A 2001       9
3 station_B 2000       3
4 station_B 2001      16
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...