В настоящее время я занимаюсь преобразованием сценария SAS в R. Я хорошо знаком с R, но не слишком хорошо знаком с SAS. Я понимаю, что пытается сделать следующий код, но я раньше не сталкивался с таким типом индексации в R и действительно мог бы помочь с некоторыми рекомендациями.
Ниже приведен блок кода SAS, который я пытаюсь преобразовать в R:
data LA_5_c;
do index = 1 by 1 until(last.Entity_name);
do index = 1 by 1 until(last.Local_Authority);
set LA_5_B;
by business_reg_number Entity_name Local_Authority;
if index gt 3 then delete;
output; end; end;
run;
Итак, я понимаю, что мы создаем новый столбец индекса на основе двух переменных Entity_name и Local_Authority. Мы также не хотим, чтобы индекс был больше 3, что, скорее всего, соответствует тому факту, что в данных есть 3 разных года.
Я понимаю, что если Entity_name и Local_Authority повторяют одни и те же ответы, строки будут проиндексированы как 1, 2, 3, 1, 2, 3.... и так далее. Но также хочу включить случаи, когда они не повторяются так периодически. Скажем, если Entity_name и Local_Authority изменяются только после 1 повторения, то индекс для этого блока будет 1, 2, 1....
Итак, я понимаю, что пытается сделать код, я просто не знаю, как реализовать это в R. Я изучил функцию setindexv(), а также использовал cbind вместе с nrow() для создания столбца индекса, но я Я совершенно озадачен, так как любая комбинация, которую я пробую, не дает того, что я хочу.
Любое руководство будет высоко оценено!
######## Обновлено:
Я добавил, как я хотел бы, чтобы мои данные выглядели ниже (результат отображается в SAS, но я хотел бы в R. Исходные данные такие же, за исключением столбца индекса.
Было бы полезно, если бы вы могли опубликовать некоторые образцы данных и желаемый результат, так как мне это не совсем понятно.
Однако это уже может вам помочь:
cumsum()
, чтобы вычислить совокупный итог постоянной переменной для каждой комбинации Entity_name и Local_authority. В основном это означает, что если значение для столбца Entity_name и Local_authority повторяется в последующих строках, столбец индекса принимает значение 1, 2, 3, ... . Всякий раз, когда возникает новая комбинация Entity_name и Local_authority, значение для индексного столбца снова начинает отсчет с 1 и далее.Ниже приведен пример с демонстрационными данными:
Сначала создайте некоторые образцы данных:
df <- data.frame("Entity_name" = c("A", "A", "A", "B", "B", "B", "B", "C", "D", "D"),
"Local_Authority" = c("F", "F", "F", "F", "G", "G", "G", "H", "I", "I"))
#Output:
> df
Entity_name Local_Authority
1 A F
2 A F
3 A F
4 B F
5 B G
6 B G
7 B G
8 C H
9 D I
10 D I
Затем создайте индексный столбец, используя функции из пакета dplyr
.
library(dplyr)
df <- df %>%
arrange(Entity_name, Local_Authority) %>%
group_by(Entity_name, Local_Authority) %>%
mutate(constant = 1,
index = cumsum(constant)) %>%
filter(index <= 3) %>%
select(-constant)
Вывод выглядит следующим образом:
Entity_name Local_Authority index
<chr> <chr> <dbl>
1 A F 1
2 A F 2
3 A F 3
4 B F 1
5 B G 1
6 B G 2
7 B G 3
8 C H 1
9 D I 1
10 D I 2
Спасибо, я немного отредактировал ваш код, поиграл с упорядочением и группировкой по переменным и, наконец, получил желаемый результат. Большое спасибо за вашу помощь!!
Привет, спасибо, что ответили мне. По вашему запросу я отредактировал исходный вопрос, чтобы показать некоторые данные, с которыми я работаю, и то, чего я хочу достичь. Я попробовал предоставленный вами код, но он не дал именно то, что я хотел. Это определенно ближе к тому, что я хочу, но все еще не получаю требуемого результата. Из приведенного выше вывода в SAS кажется, что каждый год должен относиться к одному и тому же индексу (даже если данные не упорядочены по этой переменной), однако, когда я запускаю ваш код, 2020 год ссылается как на 2, так и на 3 в двух разных случаях