【问题标题】:Calculate difference between values using different column and with gaps using R使用不同列计算值之间的差异并使用 R 计算间隙
【发布时间】:2019-07-23 00:51:43
【问题描述】:

谁能帮我弄清楚如何根据我的每月数据计算价值差异?例如,我想计算每口井每年 1 月至 7 月、2 月至 8 月、3 月至 9 月等之间的地下水值差异。请注意,在某些年份会缺少几个月。任何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)

谢谢,

西蒙

【问题讨论】:

  • 你试过什么公式?您应该发布 R 代码以生成示例数据。不要包含任何与您的问题无关的数据。
  • 请使用dput提供数据样本。另外,请具体说明您要计算的内容。
  • 哇你们这么快

标签: r group-by tidyverse dplyr


【解决方案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))

【讨论】:

  • 感谢 Jdata ...对不起,这对我来说是全新的。我不太确定我知道包含生成样本日期集的方法是什么意思。谢谢
  • 我认为这也有效 GL %>% select(Well,year,month,value) %>% group_by(Well) %>% dcast(Well+year~month,value.var=" value") %>% mutate(diff1=1-7 月,diff2=2-8 月,diff3=3-9 月等)
  • 没问题@Simon。我的意思是您应该包含与我创建 initial_tibble 的行类似的行,或者将数据集(或如果由于专有限制而不能发布的数据集)发布到诸如公共 Google 表格文件之类的内容。虽然像你一样给出结构是有帮助的,但如果你提供一个人们可以立即与之交互的数据集,你将获得更适用和更快的答案。然后我的解决方案可能是根据您的真实数据创建 full_sites_wells_months_set final_tibble,这为您和所有未来的读者提供了清晰
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-25
  • 1970-01-01
  • 2020-01-02
  • 1970-01-01
  • 1970-01-01
  • 2020-10-12
  • 1970-01-01
相关资源
最近更新 更多