Можете ли вы упорядочить строки фрейма данных, если имена дублируются? У меня очень большой набор данных, и я не могу переименовать все повторяющиеся переменные, это выглядит примерно так
И мне нужно упорядочить строки вместе с соответствующим значением перед экспортом в файл Excel (т. е. мне нужен Excel с точным форматом).
Обновлено: Извините, похоже, что во втором примере есть некоторая путаница в порядке «стат». Для целей этого вопроса предположим, что во втором примере нет конкретной логики для порядка «стат», за исключением того, что он должен быть упорядочен именно так.
Для контекста мне нужно экспортировать фрейм данных, отформатированный в очень определенном порядке, для этого нет особой причины, кроме стандартной процедуры компании.
Данные:
xyzzy = structure(list(stat = c("c", "d", "a", "b", "b", "c", "e", "f"
), value = c(3L, 7L, 9L, 5L, 1L, 5L, 8L, 5L)), class = "data.frame", row.names = c(NA,
-8L))
Если появится письмо, которое уже было заказано, перезапускать, пока не повторится то же самое?
Второй пример упорядочен определенным образом, который я не могу изменить (т.е. так должен выглядеть файл Excel) - следовательно, он не находится в обычном логическом порядке a,b,c,d,e,f.
Хм, я не совсем понимаю, что ты имеешь в виду под этим Фриде.
Я не мог понять логику вашего заказа. Почему второй b (строка 5) идет раньше первого e?
Я думаю, поскольку b встречается в строке 5 во второй раз, строки 1–4 следует упорядочить (содержащие разные буквы). Следующий фрагмент строк, который необходимо упорядочить, начинается с строки 5 до первого появления повторяющейся буквы. В данных примера этого не происходит, т. е. нет возможности проверить правильность моего понимания.





Насколько я понимаю, желаемый порядок — это первое появление каждой характеристики, а затем следующее появление каждой характеристики.
library(dplyr)
df <- tibble(stat = c("c", "d", "a", "b", "b", "e", "c"), value = c(seq(7, 1)))
df <- df |>
group_by(stat) |>
mutate(order = cumsum(row_number())) |>
arrange(order, stat) |>
select(-order)
От
stat value
<chr> <int>
1 c 7
2 d 6
3 a 5
4 b 4
5 b 3
6 e 2
7 c 1
К:
stat value
<chr> <int>
1 a 5
2 b 4
3 c 7
4 d 6
5 e 2
6 b 3
7 c 1
Если несоответствие желаемого вывода, строка 5 (как указал @metehanGungor), было просто случайностью, вы можете попробовать следующее:
libray(tidyverse)
aux %>%
arrange(value) %>%
mutate(.by = stat, pos = row_number()) %>%
arrange(pos, stat) %>%
select(-pos)
> df
# A tibble: 8 × 2
stat value
<chr> <int>
1 a 9
2 b 1
3 c 3
4 d 7
5 e 8
6 f 5
7 b 5
8 c 5
порядок stat мне ясен, но я не понимаю, существует ли какой-то определенный порядок value.
Вот решение с использованием data.table:
library(data.table)
# n samples
n <- 400
set.seed(0123)
# create table
df <- data.table::data.table(
stat = sample(letters[1:5], size = n, replace = TRUE),
value = sample(0:100, size = n, replace = TRUE)
)
# set initial order
data.table::setorder(df, stat, -value)
# get position by stat
df[, i := seq_len(.N), by = stat]
# now order again
data.table::setorder(df, i, stat)
# remove the index
df[, i := NULL]
> head(df, 10)
stat value
<char> <int>
1: a 100
2: b 100
3: c 100
4: d 100
5: e 100
6: a 99
7: b 100
8: c 99
9: d 98
10: e 99
> tail(df, 10)
stat value
<char> <int>
1: a 5
2: b 3
3: e 2
4: a 3
5: b 2
6: e 1
7: a 1
8: b 1
9: a 0
10: b 1
Однако значение if НЕ следует упорядочивать каким-либо определенным образом. Не заказывайте по нему изначально
# set initial order
data.table::setorder(df, stat, -value)
Вместо этого должно быть:
# set initial order
data.table::setorder(df, stat)
Редактировать
Если вы хотите упорядочить статистику не по алфавиту, это даст вам следующее:
# n samples
n <- 400
set.seed(0123)
# create table
df <- data.table::data.table(
stat = sample(letters[1:5], size = n, replace = TRUE),
value = sample(0:100, size = n, replace = TRUE)
)
# add custom order
custom_order <- data.table::data.table(
stat = sample(letters[1:5]),
order = 1:5
)
# merge to table
df <- data.table::merge.data.table(
df,
custom_order,
by = "stat"
)
# set initial order
data.table::setorder(df, order, -value)
# get position by stat
df[, i := seq_len(.N), by = order]
# now order again
data.table::setorder(df, i, order)
# remove the index & order
df[, i := NULL]
df[, order := NULL]
Где
> custom_order
stat order
<char> <int>
1: a 1
2: d 2
3: c 3
4: e 4
5: b 5
> head(df)
stat value
<char> <int>
1: a 100
2: d 100
3: c 100
4: e 100
5: b 100
6: a 99
> tail(df)
stat value
<char> <int>
1: e 1
2: b 2
3: a 1
4: b 1
5: a 0
6: b 1
Спасибо! Не знал, что в data.table есть функция setorder, мои данные находятся в тиббле, но я преобразую их в data.table. Также да, значение заказано
Мне трудно понять логику упорядочения в вашем втором примере. Как следует упорядочить строки?