gpt4 book ai didi

r - 使用条件对字符列进行排序/排列

转载 作者:行者123 更新时间:2023-12-04 16:23:52 30 4
gpt4 key购买 nike

我正在尝试使用 dplyrarrange 根据条件对字符串进行排序。我想在一列上排列,但如果第二列等于一个值,则按升序排列,如果第二列等于另一个值,则按降序排列。

我发现了几个类似的问题(其中一个是我自己以前的问题之一),但它们并不直接适用。它们都在数字列上排序,它们不适用于字符列。

R - Conditionally sort multiple columns as ascending or descending by group

Sort/arrange within group for only chosen groups

这里是示例数据:

df <- mtcars %>% as_tibble(rownames = "model") %>% select(model, mpg, cyl) %>% slice(1:8) %>% mutate(cond = c(rep("A", 4), rep("B", 4)))

如果 cond == "A",我想按升序对 "model"进行排序。如果 cond == "B",我想按降序对 "model"进行排序。我想要一个不依赖于 bind_rows 或类似解决方案的解决方案。

可能是以下形式:

library(dplyr)
df %>% arrange(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 Mazda 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

最佳答案

我们可以使用 group_modifygroup_by

library(dplyr)
df %>%
group_by(cond) %>%
group_modify(~.x %>%
arrange(if(.y == 'A') model else desc(model)) ) %>%
ungroup %>%
select(names(df))

-输出

# A tibble: 8 x 4
model mpg cyl cond
<chr> <dbl> <dbl> <chr>
1 Datsun 710 22.8 4 A
2 Hornet 4 Drive 21.4 6 A
3 Mazda 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

也可以subset “模型”的值 sort它单独并指定为levelsfactor得到arrange d相应地

df %>%  
arrange(factor(model, levels = c(sort(model[cond == 'A']),
sort(model[cond != "A"], decreasing = TRUE))))

-输出

# A tibble: 8 x 4
model mpg cyl cond
<chr> <dbl> <dbl> <chr>
1 Datsun 710 22.8 4 A
2 Hornet 4 Drive 21.4 6 A
3 Mazda 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

关于r - 使用条件对字符列进行排序/排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69171841/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com