#r #plyr
#r #plyr
Вопрос:
Я пытаюсь создать повторяющиеся строки по группам. Количество повторяющихся строк, которые я хочу создать, зависит от группы, и я хочу зафиксировать значение одного посещаемого столбца = 0.
Минимальный рабочий пример набора данных DF, с которым я работаю::
ID Demo Attended t
1 3 1 1
1 3 1 3
1 3 0 4
1 3 1 5
2 5 1 2
2 5 1 4
3 7 0 1
Для примера выше предположим, что я хочу, чтобы у каждого пользователя (ID) было 5 строк, причем Demo одинаковый во всех строках для каждого человека. Таким образом, я должен создать 1 строку для ID = 1, 3 для ID = 2 и 4 для ID = 4 (я хотел бы вычислить их динамически для каждой подгруппы). Для новых строк, которые я генерирую, я хочу, чтобы Attended = 0 и t принимали значение отсутствующего индекса, чтобы конечный результат был:
ID Demo Attended t
1 3 1 1
1 3 1 3
1 3 0 4
1 3 1 5
1 3 0 2
2 5 1 2
2 5 1 4
2 5 0 1
2 5 0 3
2 5 0 5
3 7 0 1
3 7 0 2
3 7 0 3
3 7 0 4
3 7 0 5
Я смог создать повторяющиеся строки по группам, но не смог понять, как создать разное количество дубликатов по участникам и правильно заполнить индексный столбец t.
Вот что у меня работает:
DF %>%
group_by(ID) %>%
rbind(., mutate(., t = row_number()))
Я пытался создать нужное количество дубликатов, используя slice()
и пытаясь получить значение t, чтобы оно было именно тем, что я хочу, но безрезультатно.
Любая помощь будет оценена!
Ответ №1:
Одной tidyverse
из возможностей может быть:
df %>%
complete(t, nesting(ID), fill = list(Attended = 0)) %>%
arrange(ID)
t ID Demo Attended
<int> <int> <int> <dbl>
1 1 1 3 1
2 2 1 3 0
3 3 1 3 1
4 4 1 3 0
5 5 1 3 1
6 1 2 5 0
7 2 2 5 1
8 3 2 5 0
9 4 2 5 1
10 5 2 5 0
11 1 3 7 0
12 2 3 7 0
13 3 3 7 0
14 4 3 7 0
15 5 3 7 0
Комментарии:
1. Привет @tmfmnk спасибо за это предложение. Это было бы очень аккуратным решением. В имеющемся у меня наборе данных есть много переменных, которые эквивалентны «Demo». Перечисление их всех заняло бы много времени. Таким образом, в функции вложенности я попытался оставить ее пустой или установить для нее значение:
nesting(-t, -Attended)
, однако это не сработало. Не могли бы вы дать некоторое представление о том, какие переменные должны быть вложены здесь? Я только что просмотрелcomplete()
документацию по функциям, но не на 100% ясен.2. Я должен отметить, что некоторые из этих «демонстрационных» столбцов не везде имеют одинаковые значения для каждого идентификатора. Для этих переменных меня устраивает любое значение для этой переменной.
3. Это действительно зависит от ваших данных. Является ли оно вложенным, вложенным только в столбец «ID» (это означает, что вам нужно N строк для каждого идентификатора) или в несколько столбцов (это означает, что вам нужно N строк для каждой комбинации ID и любых других столбцов)?
4. Привет @tmfmnk он вложен только в ID. Изменение, которое вы внесли в просто идентификатор вложения, возвращает мне ошибку. Тем не менее, большое вам спасибо за ваше руководство и указание мне на эту прекрасную функцию. Сработало следующее:
DF %>% group_by(ID) %>% complete( t = seq.int(1, 5), fill = list(Attended = 0) %>% fill(Demo) %>% fill(Demo, .direction= "up") %>% arrange(ID)
. Однако, поскольку в моих данных около 100 тыс. строк, заполнение занимает очень много времени даже для одной переменной, поэтому я буду выбирать выборочно. Если у вас есть предлагаемые улучшения для заполнения, это было бы здорово, но в остальном, большое вам спасибо.5. Если вы считаете, что этот пост помог, пожалуйста, примите его 🙂