[英]How I can calculate correlation between each variable within each group in R using dplyr package?
[英]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.frame
或as_tibble
将其转换为data.frame
或tibble
。
您可以使用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.