Разбить текст на R и назначить для выбора существующих столбцов, принимая во внимание отсутствующие наблюдения - PullRequest
1 голос
/ 12 октября 2019

Возможно, простой вопрос, но я новичок, и я не смог найти ответы, которые относятся к моему делу о переполнении стека здесь .

Я объединил два набора данных, которые теперь выглядят какэто (фактический набор данных содержит более 5000 наблюдений):

> data <- structure(list(Country = c("France", "France", "France", "Germany", 
"Germany", "Germany"), Type_a = c("Type_a", "", "Type_a", "Type_a,Type_b", 
"Type_b,Type_c,Type_f", "Type_f"), Type_b = c("", "Type_b", "Type_b", 
"", "", ""), Type_c = c("", "", "Type_c", "", "", ""), Type_d = c("", 
"Type_d", "", "", "", ""), Type_e = c("Type_e", "", "Type_e", 
"", "", ""), Type_f = c("Type_f", "", "Type_f", "", "", "")), row.names = c(NA, 
6L), class = "data.frame")
> View(data)

Пожалуйста, запустите View(data). Наблюдения за Францией находятся в правильных столбцах, но наблюдения за Германией - все в одном столбце.

Я хочу разбить данные Германии и присвоить их правым столбцам, учитывая при этом отсутствующие данные. То есть данные не могут быть просто разделены и назначены всем следующим столбцам (как в приведенной выше ссылке на переполнение стека), но только для выбора столбцов. Кроме того, я не хочу создавать новые столбцы.

Как мне это сделать?

Спасибо.

1 Ответ

0 голосов
/ 12 октября 2019

Если этот пример отражает ваши фактические данные, вы можете сделать что-то вроде:

library(tidyverse)

data %>%
  rowid_to_column() %>%
  separate_rows(Type_a, sep = ",") %>%
  pivot_longer(-c(rowid, Country)) %>%
  mutate(name = if_else(value == "", name, value)) %>%
  pivot_wider(id_cols = c(rowid, Country), values_fn = list(value = ~paste0(.x, collapse = ""))) %>%
  na_if("")

# A tibble: 6 x 8
  rowid Country Type_a Type_b Type_c Type_d Type_e Type_f
  <int> <chr>   <chr>  <chr>  <chr>  <chr>  <chr>  <chr> 
1     1 France  Type_a NA     NA     NA     Type_e Type_f
2     2 France  NA     Type_b NA     Type_d NA     NA    
3     3 France  Type_a Type_b Type_c NA     Type_e Type_f
4     4 Germany Type_a Type_b NA     NA     NA     NA    
5     5 Germany NA     Type_b Type_c NA     NA     Type_f
6     6 Germany NA     NA     NA     NA     NA     Type_f
...