Вычисление процентилей по определенным строкам во фрейме данных в r - PullRequest
0 голосов
/ 28 февраля 2019

Мои данные имеют измерение температуры для каждого дня в году и другие переменные, необходимые для анализа по VillageID.Я хотел бы создать новую переменную, которая вычисляет 95-процентный порог для всех 365 измерений температуры для каждой деревни.

Мои данные в широком формате и выглядят так:

    villageID temp1 temp2 temp3.... temp365 otherVars
1         1    70    86    98        79         x
2         2    73    89    99        86         x
3         3    71    82    96        75         x
4         4    78    79    94        81         x
5         5    90    91    89        85         x

Iхотел бы создать эту пороговую переменную 95%, которая вычисляет порог (или температурную меру), который указывает, с какой температуры начинается 95-й процентиль.Я хотел бы сделать это во всех столбцах измерения температуры [2: 366] и оставить все остальные переменные такими же.

Как это:

  villageID temp1 temp2 temp3 .....temp365 otherVars 95per
1         1    70    86    98        79         x      81
2         2    73    89    99        86         x      90
3         3    71    82    96        75         x      86
4         4    78    79    94        81         x      82
5         5    90    91    89        85         x      99

Ответы [ 2 ]

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

В базе R это будет просто (при условии, что только столбец температуры содержит строку "temp"):

 dfrm$temp95perc <- 
            apply( dfrm[ ,grep("temp", names(dfrm) )], #select just `tempNNN` columns
                      1, # row-wise calcs
                            quantile, probs=0.95) # give `quantile` a probs
0 голосов
/ 28 февраля 2019

Хотя я думаю, что вы должны хранить ваши данные в длинном формате, здесь приведен код, который вычислит их и вернет обратно в тот широкий формат, который у вас есть.Просто знайте, что часто это не лучший способ для решения проблем, особенно если вы хотите представить данные позже:

library(tidyverse)

dat <- tribble(~"villageID", ~"temp1", ~"temp2", ~"temp3", ~"temp365", 
             1,    70,    86,    98,        79, 
             2,    73,    89,    99,        86, 
             3,    71,    82,    96,        75, 
             4,    78,    79,    94,        81, 
             5,    90,    91,    89,        85) 

dat %>% 
  gather(key = "day", value = "temp", -villageID) %>% 
  group_by(villageID) %>% 
  mutate(perc_95 = quantile(temp, probs = .95)) %>% 
  spread(day, temp)
#> # A tibble: 5 x 6
#> # Groups:   villageID [5]
#>   villageID perc_95 temp1 temp2 temp3 temp365
#>       <dbl>   <dbl> <dbl> <dbl> <dbl>   <dbl>
#> 1         1    96.2    70    86    98      79
#> 2         2    97.5    73    89    99      86
#> 3         3    93.9    71    82    96      75
#> 4         4    92.0    78    79    94      81
#> 5         5    90.8    90    91    89      85

Создано в 2019-02-27 с помощью представпакет (v0.2.1)

...