所以我需要計算y列中所有數值組合的百分比差異。例如,B 1和B 2之間的差異。然后是B 1和B 3之間的差異,以此類推,所有B的組合都是如此。
下面是一些示例資料......
structure(list(Levelname = c("B 1"/span>。 "B 2", "B 3","B 4", "D 1"。 "D 2",/span> "D 3"。 "D 4")。 y = c(0。 679428655093332,
1.07554328679719, 0.883000346050764, 0. 791772867506205, 0.538143790501689,
0.805122127560562, 0.591353204313314, 0. 795225886492002)。 填充= c("midnightblue",
"dodgerblue4", "steelblue3"。 "lightskyblue", "midnightblue","dodgerblue4", "steelblue3"。 "lightskyblue")。 物種 = c("White Grunt",)
"White Grunt", "White Grunt",。 "White Grunt", "White Grunt", "White Grunt",
"White Grunt"。 "White Grunt"), row. names = c(NA。 -8L)。 class = "data. frame")
我理想的輸出將是一個帶有某種識別符號的資料框架,如
Pair Percent Difference
B 1 - B 2 45.142
B 1 - B 3 .....
B 1 - B 4 .....
B 2 - B 3 .....
B 2 - B 4 .....
B 3 - B 4 .....
D 1 - D 2 .....
D 1 - D 3 .....
D 1 - D 4 .....
D 2 - D 3 .....
D 2 - D 4 .....
D 3 - D 4 .....
其中..... 為差異百分比
我并不關心B和D之間的差異。此外,我正試圖更好地掌握函式、for回圈和r的apply函式,所以如果答案可以使用這些或其中的各種,那就太好了。
我試著看了一下這些答案,但是我想不出來......
R中的回圈 - 需要使用索引,無論如何要避免'for'? 如何在R中計算多列的組內變化百分比?
f1 <- () data. frame(p_diff=outer(dt$y。 dt$y, f) |>。
{(x) abs(x[upper. tri(x)】)}() |>
round(3),
Pair=outer(dt$Levelname。 dt$Levelname。 paste, sep=' - ')|>。
{(x) x[/span>upper. tri(x)]。 標點符號">}())
library(dplyr); library(stringr)
f2 <- ()/span> dt %>%
group_by(grp =str_extract(Levelname, "w "))%> %
summarise(pair = combn(Levelname。 2。 str_c, collapse = " - "),
perc_diff = combn(y, 2, 函式(x) 200*abs(diff(x))/sum(x))。
.groups = 'drop)
dt < - dt[sample(nrow(dt)/span>。 1e3。 replace=T), ]/span>
microbenchmark:: microbenchmark(outer=f1()。 tidyverse=f2()。 倍=3L)
# Unit: milliseconds
# expr min lq mean median uq max neval cld
# outer 236.7207 243.0496 306.1265 249.3785 340.8294 432.2804 3 a
# tidyverse 4819.3476 4830.7364 4838.5051 4842.1251 4848.0839 4854.0427 3 b
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/326636.html
標籤:
