R Spread Data Frame на основе имен строк - PullRequest
2 голосов
/ 10 апреля 2019

У меня есть фрейм данных с двумя столбцами. Имена строк дублируются как купола данных из списка отчетов с некоторыми общими полями. Каждый отчет содержит различное количество полей. Я хочу разбить этот фрейм данных на несколько столбцов на основе одного из этих дублированных имен строк. Конечный результат будет иметь каждый отчет подряд.

Эти отчеты поступают от 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

Ответы [ 2 ]

0 голосов
/ 10 апреля 2019

Вы можете просто сделать это-

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>

Примечание - Будет эффективно, если у вас большой набор данных.

0 голосов
/ 10 апреля 2019

Одна 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» со значениями из первой строки в «Column2» для каждой группы.В-третьих, он отфильтровывает строки, которые содержат content в «Столбце1».Наконец, он распространяет данные.

...