Как создать столбец условного индекса в R на основе 2 переменных в наборе данных?

В настоящее время я занимаюсь преобразованием сценария 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. Исходные данные такие же, за исключением столбца индекса.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
68
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Было бы полезно, если бы вы могли опубликовать некоторые образцы данных и желаемый результат, так как мне это не совсем понятно.

Однако это уже может вам помочь:

  • сгруппируйте свой набор данных по Entity_name и Local_Authrority
  • создайте столбец с постоянным значением 1, который служит промежуточной вспомогательной переменной.
  • Вычислите столбец индекса, используя функцию cumsum(), чтобы вычислить совокупный итог постоянной переменной для каждой комбинации Entity_name и Local_authority. В основном это означает, что если значение для столбца Entity_name и Local_authority повторяется в последующих строках, столбец индекса принимает значение 1, 2, 3, ... . Всякий раз, когда возникает новая комбинация Entity_name и Local_authority, значение для индексного столбца снова начинает отсчет с 1 и далее.
  • Отфильтровать строки по индексу <= 3.
  • Удалите постоянный столбец из фрейма данных.

Ниже приведен пример с демонстрационными данными:

Сначала создайте некоторые образцы данных:

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 в двух разных случаях

daisy 22.11.2022 16:49

Спасибо, я немного отредактировал ваш код, поиграл с упорядочением и группировкой по переменным и, наконец, получил желаемый результат. Большое спасибо за вашу помощь!!

daisy 22.11.2022 17:00

Другие вопросы по теме