У меня есть данные о налогоплательщиках, у которых есть несколько филиалов, которые создают несколько строк, которые почти дублируют друг друга, за исключением одного соответствующего столбца (деятельность предприятия). Я хочу изменить это так, чтобы у каждого налогоплательщика была только одна строка, которая включает создание столбцов «enterprise_activity_1», «enterprise_activity_2» и так далее.
Я понимаю, что это похоже на изменение формы, но я не могу придумать, как использовать tidyr::spread для достижения этой цели.
Для простоты предположим, что у нас есть фрейм данных, например:
df <- tibble::tibble(
TAXPAYER_ID = c(100, 151, 250, 250, 267, 296, 296, 304),
ENTERPRISE_ACTIVITY = rep(c("AGRICULTURE", "MANUFACTURING"), 4)
)
Чего я хотел бы добиться, так это:
TAXPAYER_ID ENTERPRISE_ACTIVITY_1 ENTERPRISE_ACTIVITY_2
100 AGRICULTURE NA
151 MANUFACTURING NA
250 AGRICULTURE MANUFACTURING
267 AGRICULTURE NA
296 MANUFACTURING AGRICULTURE
304 MANUFACTURING NA
Мои фактические данные имеют различное количество отделений на одного налогоплательщика, поэтому количество столбцов должно быть максимальным количеством отделений, которое имеет один налогоплательщик.
В основном вам нужно сгруппировать по идентификатору налогоплательщика, создать столбец для обработки повторяющихся идентификаторов и разброса, т.е.
library(tidyverse)
df %>%
group_by(TAXPAYER_ID) %>%
mutate(ENTERPRISE_ACT = row_number()) %>%
spread(key = ENTERPRISE_ACT, ENTERPRISE_ACTIVITY, sep = '_')
# A tibble: 6 x 3
# Groups: TAXPAYER_ID [6]
# TAXPAYER_ID ENTERPRISE_ACT_1 ENTERPRISE_ACT_2
# <dbl> <chr> <chr>
#1 100 AGRICULTURE <NA>
#2 151 MANUFACTURING <NA>
#3 250 AGRICULTURE MANUFACTURING
#4 267 AGRICULTURE <NA>
#5 296 MANUFACTURING AGRICULTURE
#6 304 MANUFACTURING <NA>
Спасибо, что указали на этот вопрос, но это не совсем то же самое, поскольку в моих данных нет столбца, который содержит индекс для каждого филиала в рамках налогоплательщика. Но если бы я мог создать этот индекс, я мог бы использовать tidyr::spread прямо, как в этом вопросе.