Как изменить порядок значений в одном столбце во фрейме данных, сгруппированном по другому столбцу? - PullRequest
0 голосов
/ 07 мая 2020

Для следующего фрейма данных игрушки:

df <- data.frame(A = c("A", "A", "A", "B", "B", "C", "C", "C", "C", "C"),
                 B = c(1, 2, 3, 1, 2, 1, 2, 3, 4, 5))

Этот фрейм данных состоит из 2 столбцов, из которых оба столбца отсортированы по возрастанию.

Желаемый результат - тот же фрейм данных, но с обратными значениями для столбца «B» для каждой группы, указанной значениями в столбце «A»:

> df
   A B
1  A 3
2  A 2
3  A 1
4  B 2
5  B 1
6  C 5
7  C 4
8  C 3
9  C 2
10 C 1 

Ответы [ 3 ]

1 голос
/ 07 мая 2020

Простой и удобный способ:

df %>% arrange(A, desc(B))

вывести как

   A B
1  A 3
2  A 2
3  A 1
4  B 2
5  B 1
6  C 5
7  C 4
8  C 3
9  C 2
10 C 1
1 голос
/ 07 мая 2020

Вы можете попробовать ave, если у вас база R:

df <- within(df,B <- ave(B,A,FUN = function(x) sort(x,decreasing = TRUE)))

, что дает

> df
   A B
1  A 3
2  A 2
3  A 1
4  B 2
5  B 1
6  C 5
7  C 4
8  C 3
9  C 2
10 C 1
1 голос
/ 07 мая 2020

В этом случае столбец 'B' - это число c, поэтому использование функции order со знаком минус перед df$B работает

df$B <- df$B[order(df$A, -df$B)]

Более общее использование функция xtfrm в случае, если столбец 'B' не является числом c в других подобных случаях:

df$B <- df$B[order(df$A, -xtfrm(df$B))]
...