如何根据条件只安排 Dataframe 的某些行,而不影响其余行(R中)

h43kikqp  于 2023-01-15  发布在  其他
关注(0)|答案(3)|浏览(177)

我有这样一个 Dataframe :

df <- tibble::tribble(
   ~COLOR, ~NUMBER, ~VALUE,
  "BLACK",      1L,   100L,
  "BLACK",      2L,   200L,
   "BLUE",      1L,   100L,
   "BLUE",      2L,   500L,
   "BLUE",      3L,   600L,
    "RED",      1L,   200L,
    "RED",      2L,   300L)

我只想按NUMBER列的值降序排列COLOR列中标记为“BLUE”的行,而不修改其他行的位置或顺序,如下所示:

tibble::tribble(
    ~COLOR, ~NUMBER, ~VALUE,
    "BLACK",    1L,   100L,
    "BLACK",    2L,   200L,
    "BLUE",     3L,   600L,
    "BLUE",     2L,   500L,
    "BLUE",     1L,   100L,
    "RED",      1L,   200L,
    "RED",      2L,   300L)

这似乎是一个简单的任务,我一直在尝试与不同的一些组合'安排()','跨越()',和'group_by',但我没有得到正确的代码。
我想代码可能是这样的:

df %>%
  group_by(COLOR) %>%
  arrange(.by_group = TRUE, if(condition == COLOR = "BLUE", true = desc(NUMBER)))

感谢你的帮助。谢谢。

9rbhqvlz

9rbhqvlz1#

如果列是数字,我们可以将"NUMBER"中的值修改为负数,其中COLOR是"BLUE",在arrange中按降序排列

library(dplyr)
df %>% 
    arrange(factor(COLOR, levels = unique(COLOR)),
      NUMBER * c(1, -1)[(COLOR == "BLUE") + 1])
  • 输出
# A tibble: 7 × 3
  COLOR NUMBER VALUE
  <chr>  <int> <int>
1 BLACK      1   100
2 BLACK      2   200
3 BLUE       3   600
4 BLUE       2   500
5 BLUE       1   100
6 RED        1   200
7 RED        2   300

如果列不是数值,则使用group_by/group_modify作为另一个选项

df %>% 
  group_by(COLOR = factor(COLOR, levels = unique(COLOR))) %>%
  group_modify(~ .x %>% arrange(if(.y == "BLUE") desc(NUMBER) else 
       NUMBER, .by_group = TRUE)) %>% 
  ungroup
  • 输出
# A tibble: 7 × 3
  COLOR NUMBER VALUE
  <chr>  <int> <int>
1 BLACK      1   100
2 BLACK      2   200
3 BLUE       3   600
4 BLUE       2   500
5 BLUE       1   100
6 RED        1   200
7 RED        2   300
bweufnob

bweufnob2#

在不修改其他行的位置的情况下,可以使用base样式的赋值。

library(dplyr)

df %>%
  filter(COLOR == "BLUE") %>%
  arrange(desc(NUMBER)) -> df[df$COLOR == "BLUE", ]

df
# # A tibble: 7 × 3
#   COLOR NUMBER VALUE
#   <chr>  <int> <int>
# 1 BLACK      1   100
# 2 BLACK      2   200
# 3 BLUE       3   600
# 4 BLUE       2   500
# 5 BLUE       1   100
# 6 RED        1   200
# 7 RED        2   300
68bkxrlz

68bkxrlz3#

这里有一个解决方案:

library(dplyr)

df %>%
  group_by(COLOR) %>%
  arrange(row_number(x = if_else(COLOR == "BLUE",-NUMBER,NUMBER )),.by_group = TRUE)

相关问题