R: Использование dplyr для создания фрейма данных с процентом на группу - PullRequest
0 голосов
/ 30 мая 2018

У меня возникают проблемы при попытке создать новый фрейм данных, который создает процент в год с помощью dplyr.

Фрейм данных выглядит следующим образом:

    structure(list(orgid = c("USGS-NJ", "USGS-NJ", "USGS-NJ", "USGS-NJ", 
"USGS-NJ", "USGS-NJ", "USGS-NJ", "USGS-NJ", "USGS-NJ", "USGS-NJ", 
"USGS-PA", "USGS-PA", "USGS-NJ", "USGS-NJ", "USGS-NJ"), stdate = structure(c(16134, 
16133, 16135, 16133, 16105, 15749, 16112, 16394, 16610, 16610, 
16511, 16560, 16566, 16328, 16324), class = "Date"), locid = c("USGS-01367785", 
"USGS-01455099", "USGS-01440000", "USGS-01380100", "USGS-01398000", 
"USGS-01461880", "USGS-0140940950", "USGS-01482500", "USGS-0146453250", 
"USGS-0146453250", "USGS-01444800", "USGS-01444800", "USGS-01477120", 
"USGS-01392150", "USGS-01376274"), charnam = c("Total dissolved solids", 
"Total dissolved solids", "Total dissolved solids", "Total dissolved solids", 
"Total dissolved solids", "Total dissolved solids", "Total dissolved solids", 
"Total dissolved solids", "Total dissolved solids", "Total dissolved solids", 
"Total dissolved solids", "Total dissolved solids", "Total dissolved solids", 
"Total dissolved solids", "Total dissolved solids"), val = c("154", 
"333", "109", "143", "711", "218", "104", "157", "506", "471", 
"3040", "1110", "142", "429", "266")), .Names = c("orgid", "stdate", 
"locid", "charnam", "val"), row.names = c(NA, 15L), class = "data.frame")

Я хочу создать новый столбецс процентом общего количества растворенных твердых веществ в каждом году, который составляет> 500.

Код, который у меня есть на данный момент:

if (!require(pacman)) {
  install.packages('pacman')

}

pacman::p_load("ggplot2","tidyr","plyr","dplyr")
#### Read in the necessary data ######
roadsalt_data<-read.table("QADportaldata_1988-2015.tsv",header=T,sep="\t",fill=T,stringsAsFactors = F)
#Convert date column from a character class to a date class so ggplot can  display as a continuous variable ###
roadsalt_data$stdate <- as.Date(roadsalt_data$stdate)
## Filter dataset to only contain columns I need ########
filtered_roadsalt <- roadsalt_data %>% 
  select(orgid, stdate,locid, charnam,val) %>%
  filter(between(stdate, as.Date("1996-01-01"), as.Date("2015-07-01"))) %>%
  filter(charnam == "Total dissolved solids" & as.numeric(as.character(val)) > 50.00)
##create a dataframe for percent of TDS >500
percent_data<-filtered_roadsalt %>%
  mutate(year=as.Date(cut(stdate, breaks = "year"))) %>%
  group_by(year) %>%
  mutate(prop = round(as.numeric(as.character(val))/sum(as.numeric(as.character(val)))*100, 2))

Это, однако, не дает мне результатов, которых я добиваюсь.у меня должен быть 19 наблюдений и 2 переменные.19 наблюдений, проводимых каждый год с 1997 по 2015 год, и процент.Любая помощь будет принята с благодарностью!Спасибо!

Ответы [ 2 ]

0 голосов
/ 30 мая 2018
install.packages("scales")

scales::percent(2.842215e-03)

0.284%

См. Также options(digits=) и options(scipen=) для других стратегий.

0 голосов
/ 30 мая 2018

Сначала вам нужно преобразовать val в числовое значение и получить годы для каждой даты.Это можно сделать с помощью lubridate::year.count является сокращением для группировки по переменным и их суммирования, где единственная сводная статистика, которая вам нужна, это количество наблюдений.Это может не относиться к вашему полному набору данных, но в опубликованном образце за 2013 год не было никаких наблюдений со значениями, превышающими 500, поэтому в итоговых данных не будет строки (TRUE, 2013).Поэтому я использовал complete, чтобы заполнить строку, чтобы явным образом показать 0 из этих наблюдений.

library(tidyverse)

shares <- df %>%
  as_tibble() %>%
  mutate(val = as.numeric(val)) %>%
  mutate(year = lubridate::year(stdate)) %>%
  count(year, charnam, isOver500 = val > 500) %>%
  complete(isOver500, nesting(year, charnam), fill = list(n = 0)) %>%
  mutate(share = n / sum(n))

shares
#> # A tibble: 6 x 5
#>   isOver500  year charnam                    n  share
#>   <lgl>     <dbl> <chr>                  <dbl>  <dbl>
#> 1 FALSE      2013 Total dissolved solids     1 0.0667
#> 2 FALSE      2014 Total dissolved solids     8 0.533 
#> 3 FALSE      2015 Total dissolved solids     2 0.133 
#> 4 TRUE       2013 Total dissolved solids     0 0     
#> 5 TRUE       2014 Total dissolved solids     1 0.0667
#> 6 TRUE       2015 Total dissolved solids     3 0.2

shares %>%
  filter(isOver500)
#> # A tibble: 3 x 5
#>   isOver500  year charnam                    n  share
#>   <lgl>     <dbl> <chr>                  <dbl>  <dbl>
#> 1 TRUE       2013 Total dissolved solids     0 0     
#> 2 TRUE       2014 Total dissolved solids     1 0.0667
#> 3 TRUE       2015 Total dissolved solids     3 0.2

Создано в 2018-05-30 пакетом представлением (v0.2.0).

...