У меня есть фрейм данных с двумя столбцами. Имена строк дублируются как купола данных из списка отчетов с некоторыми общими полями. Каждый отчет содержит разное количество полей. Я хочу распространить этот фрейм данных на несколько столбцов на основе одного из этих повторяющихся имен строк. Конечный результат будет иметь каждый отчет в строке.
Эти отчеты поступают из API, который существует в рабочей системе. Он возвращает очень вложенный JSON. Я хотел посмотреть, даст ли перевод данных в этот формат способ очистить данные.
Минимальный пример данных
Column1 Column2
contentID 123
value1 California
value2 truck
value3 home
contentID 897
value1 Georgia
value2 car
value3 work
value4 boeing
contentID 537
value2 truck
value4 private
value5 first class
value6 wheels
Желаемый результат
ContentID value1 value2 value3 value4 value5 value6
123 California truck home NA NA NA
897 Georgia car work boeing NA NA
537 NA truck NA private firstclass wheels
Одна tidyverse
возможность может быть:
df %>%
mutate(id = cumsum(grepl("content", Column1))) %>%
group_by(id) %>%
mutate(ContentID = first(Column2)) %>%
filter(!grepl("content", Column1)) %>%
ungroup() %>%
select(-id) %>%
spread(Column1, Column2)
ContentID value1 value2 value3 value4 value5 value6
<chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 123 California truck home <NA> <NA> <NA>
2 537 <NA> truck <NA> private first_class wheels
3 897 Georgia car work boeing <NA> <NA>
Здесь он сначала создает переменную ID на основе вхождения content
в «Столбец1» и группирует по ней. Во-вторых, он создает переменную «ContentID» со значениями из первой строки в «Столбце2» для каждой группы. В-третьих, он отфильтровывает строки, содержащие content
в «Столбце1». Наконец, он распространяет данные.
Вы можете просто сделать это-
library(data.table)
library(zoo)
setDT(dt)
dt[,id:=ifelse(Column1 %like% "contentID",paste(Column2),NA)]
dt[,id:=na.locf(id)]
dcast.data.table(dt,id~Column1,value.var = "Column2",subset = .(Column1! = "contentID"))
id value1 value2 value3 value4 value5 value6
1: 123 California truck home <NA> <NA> <NA>
2: 537 <NA> truck <NA> private firstclass wheels
3: 897 Georgia car work boeing <NA> <NA>
Примечание — это будет эффективно, если у вас большой набор данных.
Это работало очень быстро и дало мне тот же желаемый результат.
Мне любопытно. Как бы вы изменили это, если бы у вас также были повторяющиеся значения внутри каждой группы contentID?