我試圖使用dplyr的arrange來根據一個條件對字串進行排序。我想在一列上進行arrange,但如果第二列等于一個值,則以升序排序,如果第二列等于另一個值,則以降序排序。
我找到了幾個類似的問題(其中一個是我自己以前的問題之一),但它們并不直接適用。這兩個問題都是在數字列上進行排序的,它們在字符列上不起作用。
以下是示例資料:
df <- mtcars %> % as_tibble(rownames = "model"/span>) %> % select(model, mpg, cyl) %> % slice(1。 8) %> % mutate(cond = c(rep("A">。 4)。 rep("B"/span>。 4)))
如果cond == "A",我想將 "model "按升序排序。如果 cond == "B",我想對 "model "按降序排序。我想要一個不依賴bind_rows或類似解決方案的解決方案。
可能的形式是:
library(dplyr)
df %> %安排(ifelse(cond == "A"。 model, desc(model)))
所需的解決方案看起來像:
## A tibble: 8 x 8
# model mpg cyl cond
# <chr> <dbl> <dbl> <chr>
#1 Datsun 710 22.8 4 A
#2 Hornet 4 Drive 21.4 6 A
#3 馬自達RX4 21 6 A
#4 Mazda RX4 Wag 21 6 A
#5 Valiant 18.1 6 B
#6 Merc 240D 24.4 4 B
#7 Hornet Sportabout 18.7 8 B
#8 Duster 360 14.3 8 B
uj5u.com熱心網友回復:
我們可以使用group_modify和group_by
library(dplyr)
df %>%。
group_by(cond) %>%
group_modify(~.x %>%)
安排(if(. y == 'A) model else desc(model)) ) %> %
ungroup %>%
select(names(df))
輸出
# A tibble: 8 x 4
型號 mpg cyl cond
<chr> <dbl> <dbl> <chr>
1Datsun 710 22.8 4A
2 大黃蜂 4 驅動 21.4 6 A
3 馬自達RX4 21 6 A
4 馬自達RX4 Wag 21 6 A
5 Valiant 18.1 6 B
6 Merc 240D 24.4 4B
7 Hornet Sportabout 18.7 8 B
8 Duster 360 14.3 8 B
也可以subset'model'的值sort它分開,并在factor中指定那些作為levels,以便得到相應的arranged
df %>%
arrange(factor(model, 水平= c(sort(Model[cond == 'A'])。
sort(model[/span>cond ! = "A"/span>]。 減少= TRUE))))
輸出
# A tibble: 8 x 4
型號 mpg cyl cond
<chr> <dbl> <dbl> <chr>
1Datsun 710 22.8 4A
2 大黃蜂 4 驅動 21.4 6 A
3 馬自達RX4 21 6 A
4 馬自達RX4 Wag 21 6 A
5 Valiant 18.1 6 B
6 Merc 240D 24.4 4B
7 Hornet Sportabout 18.7 8 B
8 Duster 360 14.3 8 B
uj5u.com熱心網友回復:
這是相當混亂的,但它是有效的。
這是相當混亂的,但它是有效的。
mtcars %>%
as_tibble(rownames = "model") %>%
select(model,mpg, cyl) %>%
slice(1:8) %>%
mutate(cond = c(rep("A">。 4)。 rep("B"/span>。 4)) %> %
group_by(cond) %> %
arrange(model, . by_group = TRUE) %>% .
add_rownames(. , var = "rowna") %>%
mutate(rowna = as. numeric(rowna) %>%
rowwise() %>%
mutate(idx = ifelse(cond == "A"/span>。 rowna, 8 - rowna)) %> %
group_by(cond) %> %
arrange(idx, . by_group = TRUE) %>% .
選擇(-idx, -rowna)
型號 mpg cyl cond
<chr> <Dbl> <dbl> <chr>
1Datsun 710 22.8 4A
2 大黃蜂 4 驅動 21.4 6 A
3 馬自達RX4 21 6 A
4 馬自達RX4 Wag 21 6 A
5 Valiant 18.1 6 B
6 Merc 240D 24.4 4B
7 Hornet Sportabout 18.7 8 B
8 Duster 360 14.3 8 B
uj5u.com熱心網友回復:
正如我發現的那樣,一個基本的R解決方案要簡單得多:
正如我發現的那樣,一個基本的R解決方案要簡單得多。
split(df, df$cond) < - lapply(split(df, df$cond)。 function(d) {
d[order(d$model。 遞減= 全部(d$cond == "B"))。 ]
})
這是按條件分割資料集,然后根據條件是 "A "還是 "B "對每個分割進行排序,然后將分割的資料重新插入到各自的位置。
uj5u.com熱心網友回復:
這可以通過dplyr::arrange和ifelse輕松完成。訣竅在于{dplyr}沒有asc函式,所以我們需要rev反轉desc的結果:
library(dplyr)
df %>%
arrange(cond, ifelse(cond == "B", desc(model)。 rev(desc(model))))
#> # A tibble: 8 x 4
#> model mpg cyl cond
#> <chr> <dbl> <dbl> <chr>
#> 1 Datsun 710 22.8 4 A
#> 2 Mazda RX4 21 6 A
#> 3 Hornet 4 Drive 21.4 6 A
#> 4 馬自達RX4 Wag 21 6 A
#> 5 Valiant 18.1 6 B
#> 6 Merc 240D 24.4 4 B
#> 7 Hornet Sportabout 18.7 8 B
#> 8 Duster 360 14.3 8 B
我們也可以寫一個包裝函式asc。
asc < - function(x) {
rev(dplyr::desc(x))
}
df %>%
arrange(cond, ifelse(cond == "B", desc(model)。 asc(model)))
#> # A tibble: 8 x 4
#> model mpg cyl cond
#> <chr> <dbl> <dbl> <chr>
#> 1 Datsun 710 22.8 4 A
#> 2 Mazda RX4 21 6 A
#> 3 Hornet 4 Drive 21.4 6 A
#> 4 馬自達RX4 Wag 21 6 A
#> 5 Valiant 18.1 6 B
#> 6 Merc 240D 24.4 4 B
#> 7 Hornet Sportabout 18.7 8 B
#> 8 Duster 360 14.3 8 B
創建于2021-09-14,由reprex軟體包(v2.0.1)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/310833.html
標籤:
上一篇:如何將哈希姆圖按數值降序排序,如果數值相同,則按鍵升序排序
下一篇:在內部類中訪問的原子變數
