我的数据包含一年中每一天的温度测量值以及根据villageID分析所需的其他变量。我想创建一个新变量,计算每个村庄所有365个温度测量值的95%阈值。
我的数据采用宽格式,如下所示:
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
我想创建此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
答案 0 :(得分:1)
尽管我认为您应该将数据保留为长格式,但是这里有一些代码将对其进行计算,然后将其恢复为您所拥有的宽格式。只是经常知道这并不是处理问题的最佳方法,特别是如果您以后想要绘制数据时:
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
由reprex package(v0.2.1)于2019-02-27创建
答案 1 :(得分:0)
在基数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