Создайте новые переменные из неорганизованных данных с переменными в нескольких столбцах с помощью pivot_wider - PullRequest
1 голос
/ 25 февраля 2020

У меня есть фрейм данных со следующей структурой:

library(tidyverse)

df <- tibble::tribble(
              ~var1,            ~var2,              ~var3, 
        "ano 2005",      "km 128000",         "marca chevrolet",
        "ano 2019",     "marca hyundai tucson",        "km 50000",
    "marca grand vitara sz",     "ano 2012",              "NA"
    )

Мне нужно создать новые переменные, для которых назначена соответствующая информация, используйте следующий код

df %>% 
stack() %>% 
select(-ind) %>% 
separate(values, into = c("column", "value")) %>% 
pivot_wider(value, column, values_fn = list(value = list)) %>% 
unnest(cols = c(marca, ano, km))

, но Имея NA, у меня есть следующая ошибка: Нет общего размера для marca, размер 120 и km, размер 119. Есть и другая ошибка, и она просто возвращает первое слово, а остальное удаляет его. если кто-нибудь может мне помочь, я был бы очень признателен

 ano   marca        km
2005   chevrolet  128000
2019   hyundai     50000
2012   grand        

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

вот мой data.table -приход

library( data.table )

#set to data.table format
setDT(df)
#create row_id's
df[, id := .I][]
#melt to long
ans <- melt( df, id.vars = "id" )
#split strings, using first space as separator
ans[, c("col_name", "col_value") := as.data.table( stringr::str_split_fixed( value, " ", 2 ) ) ]
#cast to wide
dcast( ans[!col_name == "NA",], id ~ col_name, value.var = "col_value")

#    id  ano     km           marca
# 1:  1 2005 128000       chevrolet
# 2:  2 2019  50000  hyundai tucson
# 3:  3 2012   <NA> grand vitara sz
0 голосов
/ 25 февраля 2020

Вот решение tidyverse. Для этого требуется, чтобы значение NA в вашем фрейме данных было NA_character_, а не строка в кавычках "NA". Аргумент extra='merge' говорит separate() не пропускать дополнительные слова в названии модели автомобиля после первого.

# replace quoted NA with true NA
df[df == 'NA'] <- NA_character_

 df %>%
  mutate(id = 1:nrow(df)) %>%
  pivot_longer(-id) %>%
  separate(value, into = c('column', 'value'), extra = 'merge') %>%
  select(-name) %>%
  filter(!is.na(column)) %>%
  pivot_wider(id_cols = id, names_from = column)

# A tibble: 3 x 4
#     id ano   km     marca          
#  <int> <chr> <chr>  <chr>          
#1     1 2005  128000 chevrolet      
#2     2 2019  50000  hyundai tucson 
#3     3 2012  NA     grand vitara sz
...