我想在我的資料集中為不同的組提取大小分布的百分位數(在那個例子中,比如說 10% 和 50%)。大小按遞增順序排列。我的想法是過濾累積百分比并選擇邊緣的值(例如,如果我想要最大值的百分位數 10,我將過濾關于百分比的大小,然后取最小值)。不過,當我嘗試使用該代碼過濾累積百分比時df <- df %>% filter(., Cum <= 10) %>% map(~slice(.,which.min(Size))),我對其中兩個站點都有“NA”。這是因為這些站點中的累積百分比沒有低于 10 的值。
如果沒有低于 10% 的值,我應該如何繼續選擇最小的累積值?
df <- list(structure(list(Size = c(42, 40, 40, 37, 36, 36, 35, 35,
35, 34, 34, 34, 33, 33, 33, 31, 30, 29, 29, 27, 26, 23), SubStation = c("B",
"B", "B", "B", "B", "B", "B", "B",
"B", "B", "B", "B", "B", "B", "B",
"B", "B", "B", "B", "B", "B", "B"
), Cum = c(4.54545454545455, 9.09090909090909, 13.6363636363636,
18.1818181818182, 22.7272727272727, 27.2727272727273, 31.8181818181818,
36.3636363636364, 40.9090909090909, 45.4545454545455, 50, 54.5454545454545,
59.0909090909091, 63.6363636363636, 68.1818181818182, 72.7272727272727,
77.2727272727273, 81.8181818181818, 86.3636363636364, 90.9090909090909,
95.4545454545455, 100)), row.names = c(NA, -22L), class = c("tbl_df",
"tbl", "data.frame")), structure(list(Size = c(43, 42, 36, 36,
35, 35, 34, 34, 34, 33, 31, 31, 30, 30, 28, 27, 27, 27, 25, 25,
25, 25, 24, 23), SubStation = c("M1", "M1",
"M1", "M1", "M1", "M1",
"M1", "M1", "M1", "M1",
"M1", "M1", "M1", "M1",
"M1", "M1", "M1", "M1",
"M1", "M1", "M1", "M1",
"M1", "M1"), Cum = c(4.16666666666667, 8.33333333333333,
12.5, 16.6666666666667, 20.8333333333333, 25, 29.1666666666667,
33.3333333333333, 37.5, 41.6666666666667, 45.8333333333333, 50,
54.1666666666667, 58.3333333333333, 62.5, 66.6666666666667, 70.8333333333333,
75, 79.1666666666667, 83.3333333333333, 87.5, 91.6666666666667,
95.8333333333333, 100)), row.names = c(NA, -24L), class = c("tbl_df",
"tbl", "data.frame")), structure(list(Size = c(36, 34, 34, 32,
32, 24), SubStation = c("M2", "M2", "M2",
"M2", "M2", "M2"), Cum = c(16.6666666666667,
33.3333333333333, 50, 66.6666666666667, 83.3333333333333, 100
)), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"
)), structure(list(Size = c(34, 33, 33, 28, 25, 24), SubStation = c("M3",
"M3", "M3", "M3", "M3",
"M3"), Cum = c(16.6666666666667, 33.3333333333333,
50, 66.6666666666667, 83.3333333333333, 100)), row.names = c(NA,
-6L), class = c("tbl_df", "tbl", "data.frame")))
uj5u.com熱心網友回復:
這里有if和else功能,就可以了。我為 P50 和 P10 都做了,并將它們加入到一個獨特的表中(我曾經bind_row()從一個分開的小標題回傳到一個資料框)。
P10 <- df %>% map(~filter(., if(any(Cum < 10)) Cum <= 10 else row_number(Cum) <= 1)) %>%
map(~slice(.,which.min(Size))) %>% bind_rows() %>% select(P10 = Size, SubStation)
P10P50 <- df %>% map(~filter(., if(any(Cum < 50)) Cum <= 50 else row_number(Cum) <= 1)) %>%
map(~slice(.,which.min(Size))) %>% bind_rows() %>% select(P50 = Size, SubStation) %>% inner_join(P10, by = "SubStation", copy = FALSE) %>% relocate(SubStation, P10, P50)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/529081.html
標籤:r
