Рассчитать разницу между значениями, используя другой столбец и с промежутками, используя R

Может ли кто-нибудь помочь мне понять, как рассчитать разницу в значениях на основе моих месячных данных? Например, я хотел бы рассчитать разницу в значениях подземных вод между январем-июлем, февралем-августом, мартом-сентябрем и т. д. для каждой скважины по годам. Обратите внимание, что в некоторые годы будет отсутствовать несколько месяцев. Буду признателен за любые tidyverse решения.

    Well  year month     value
   <dbl> <dbl> <fct>     <dbl>
 1   222  1995 February   8.53
 2   222  1995 March      8.69
 3   222  1995 April      8.92
 4   222  1995 May        9.59
 5   222  1995 June       9.59
 6   222  1995 July       9.70
 7   222  1995 August     9.66
 8   222  1995 September  9.46
 9   222  1995 October    9.49
10   222  1995 November   9.31
# ... with 18,400 more rows

df1 <- subset(df, month %in% c("February", "August"))
test <- df1 %>% 
  dcast(site + year + Well ~ month, value.var = "value") %>%
  mutate(Diff = February - August)

Спасибо,

Саймон


person Simon    schedule 01.03.2019    source источник
comment
Какие формулы вы пробовали? Вы должны опубликовать код R для создания образца данных. Не включайте никакие данные, не относящиеся к вашему вопросу.   -  person Adam Smith    schedule 01.03.2019
comment
Пожалуйста, используйте dput, чтобы предоставить образец данных. Также укажите, что именно вы хотите рассчитать.   -  person yusuzech    schedule 01.03.2019
comment
Вау, ребята, вы такие быстрые   -  person Simon    schedule 01.03.2019


Ответы (1)


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

# load required library
library(dplyr)

# generate data set of all site, well, and month combinations
## define valid values
sites = letters[1:3]
wells = 1:5
months = month.name

## perform a series of merges 
full_sites_wells_months_set <- 
    merge(sites, wells) %>%
    dplyr::rename(sites = x, wells = y) %>% # this line and the prior could be replaced on your system with initial_tibble %>% dplyr::select(sites, wells) %>% unique() 
    merge(months) %>% 
    dplyr::rename(months = y) %>% 
    dplyr::arrange(sites, wells)

# create sample initial_tibble
## define fraction of records to simulate missing months
data_availability <- 0.8

initial_tibble <- 
    full_sites_wells_months_set %>% 
    dplyr::sample_frac(data_availability) %>% 
    dplyr::mutate(values = runif(nrow(full_sites_wells_months_set)*data_availability)) # generate random groundwater values

# generate final result by joining full expected set of sites, wells, and months to actual data, then group by sites and wells and perform lag subtraction
final_tibble <- 
    full_sites_wells_months_set %>% 
    dplyr::left_join(initial_tibble) %>% 
    dplyr::group_by(sites, wells) %>% 
    dplyr::mutate(trailing_difference_6_months = values - dplyr::lag(values, 6L))
person jdata    schedule 01.03.2019
comment
Спасибо, Jdata... извините, для меня это все в новинку. Я не совсем уверен, что понимаю, что вы имеете в виду, говоря о методе создания образца набора дат. Спасибо - person Simon; 01.03.2019
comment
Думаю, это тоже сработало GL %›% select(Well,year,month,value) %›% group_by(Well) %›% dcast(Well+year~month,value.var=value) %›% mutate(diff1= Январь-июль, diff2 = февраль-август, diff3 = март-сентябрь и т. д.) - person Simon; 01.03.2019
comment
Нет проблем @Simon. Я просто имел в виду, что вы должны включить строки, подобные моей, где я создаю initial_tibble или публикую набор данных (или его подмножество, если вы не можете из-за проприетарных ограничений) во что-то вроде общедоступного файла Google Sheets. Хотя такая структура, как вы, полезна, вы получите более применимые и более быстрые ответы, если предоставите набор данных, с которым люди могут немедленно взаимодействовать. Тогда моим решением могло бы быть создание full_sites_wells_months_set и final_tibble из ваших реальных данных, что обеспечивает ясность для вас и всех будущих читателей. - person jdata; 02.03.2019