繁体   English   中英

我如何使用 dplyr 计算 R 中每对差异的分位数?

[英]how i can calculate the quantile of a difference of each pair in R using dplyr?

假设我在 R 中有如下所示的数据框:


var2 = c(rep("A",3),rep("B",3),rep("C",3),rep("D",3),rep("E",3),rep("F",3),
         rep("H",3),rep("I",3))

y2 = rnorm(24)
data2 = tibble(var2,y2)%>%base::print(n=30);data2


我想使用 dplyr 计算 R 中每个不同对的差异的 99% 分位数。 理想情况下,我希望看起来像这样(第三列包含每个相关对的值):

变量1 变量2 价值
一个 分位数(AB,0.99)
一个 C 分位数(AC,0.99)
一个 D 分位数(AD,0.99)
一个 分位数(AE,0.99)
C 分位数(BC,0.99)
D 分位数(BD,0.99)
分位数(BE,0.99)
C D 分位数(CD,0.99)
C 分位数(CE,0.99)
D 分位数(DE,0.99)

到目前为止,我的尝试是:

data2%>%
  dplyr::mutate(index = sequence(rle(var2)$lengths))%>%
  pivot_wider(index, names_from = "var2", values_from = "y2")%>%
  dplyr::select(-index)

导致

# A tibble: 3 x 8
       A      B       C       D       E      F       H      I
   <dbl>  <dbl>   <dbl>   <dbl>   <dbl>  <dbl>   <dbl>  <dbl>
1  1.33  -0.539  0.458   1.51    0.990  -1.24   0.306  -0.337
2 -0.542 -0.359  0.0107 -0.0449  0.0222  1.03  -0.238   0.354
3 -0.840  0.843 -1.73   -0.414  -0.874   0.522 -0.0762 -0.777

我可以继续

data2%>%
  dplyr::mutate(index = sequence(rle(var2)$lengths))%>%
  pivot_wider(index, names_from = "var2", values_from = "y2")%>%
  dplyr::select(-index)%>%
  quantile(,0.99)%>%
  as.data.frame.table(responseName = "QUANTILE")%>%
  dplyr::filter(format(Var1) < format(Var2))

但我不知道如何计算每对的差异。 我怎么能在 R 中做到这一点? 有什么帮助吗?

这是使用outer的 base R 中的一个选项。

vec <- with(data2, setNames(y2, var2)).   # Turn `data.frame` into `vector`
lst <- split(vec, names(vec))             # Split `vector` on names
outer(
    setNames(seq_along(lst), names(lst)), 
    setNames(seq_along(lst), names(lst)),
    FUN = Vectorize(function(i, j) quantile(lst[[i]] - lst[[j]], probs = 0.99)))
#         A         B        C        D          E          F         H         I
#A 0.0000000 1.0022382 3.835410 2.339986 0.94314229 -0.3951486 0.7687369 0.9090856
#B 1.0670568 0.0000000 2.845121 3.407043 0.09522425  0.3434554 0.2499785 1.9761424
#C 2.5396299 2.0461416 0.000000 4.040152 1.37209725  1.4944558 1.8316670 2.6092508
#D 1.2580325 2.2602707 5.075953 0.000000 2.19736422  0.8561844 2.0267693 1.0734799
#E 1.1675326 0.6770104 2.892267 3.324613 0.00000000  0.2610250 0.4595697 1.8937120
#F 1.0451740 1.4040863 4.230558 3.063588 1.34117977  0.0000000 1.1705849 1.6326870
#H 0.8170783 0.2335014 3.068946 3.157065 0.17667867  0.0934769 0.0000000 1.7261639
#I 0.1845526 1.1867908 4.002474 1.430901 1.12388433 -0.2172954 0.9532894 0.0000000

这将返回一个matrix 您可以根据需要使用as.data.frameas_tibble将其转换为data.frametibble

您可以使用combn()来获取一对唯一的 var2; lapply()估计差异的第 99 个百分位,并使用bind_rows()绑定每个单独的结果

bind_rows(
  lapply(combn(unique(data2$var2),2, simplify=F), \(x) {
    data2 %>%
      summarize(value = quantile(y2[var2==x[1]] - y2[var2==x[2]], prob=0.99)) %>% 
      mutate(var1=x[1], var2=x[2]) %>% 
      relocate(value, .after=everything())
  })
)

输出:

# A tibble: 28 × 3
   var1  var2  value
   <chr> <chr> <dbl>
 1 A     B     0.339
 2 A     C     1.63 
 3 A     D     2.89 
 4 A     E     1.62 
 5 A     F     1.35 
 6 A     H     1.10 
 7 A     I     0.200
 8 B     C     2.11 
 9 B     D     3.37 
10 B     E     1.30 
# … with 18 more rows

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM