Разделить столбец на несколько столбцов на основе строкового шаблона (перед разделителем) - PullRequest
0 голосов
/ 04 марта 2019

Я хотел бы сделать следующее в R (но я открыт для предложений в bash): у меня есть длинный список элементов (20 000), которые являются частью 80 групп.Каждая группа начинается с той же строки перед разделителем подчеркивания.Я хочу разбить столбец всех элементов на новый фрейм данных, содержащий 80 столбцов, в соответствии с шаблоном перед подчеркиванием.Столбцы будут иметь разные размеры, поэтому значения NA являются приемлемыми.

Например, столбец, который я хочу разделить:

head(df$V1)

FOO1_Yu
FOO1_uN
FOO2_Yo
FOO2_yA
FOO10_nO
FOO10_Yes
FOO1_NoY

Желаемый результат (новый df, с заголовками, включенными в первый ряд):

head(df2)
FOO1    FOO2    FOO10
FOO1_Yu FOO2_Yo FOO10_nO
FOO1_uN FOO2_yA FOO10_Yes
FOO1_NoY        

Любые идеи?(И заранее спасибо!)

1 Ответ

0 голосов
/ 04 марта 2019

Далее используется пакет reshape2 для получения результатов, которые вы ищете.Обратите внимание, что, поскольку столбцы преобразуются в длинный формат data.frame, где существуют пропущенные значения, они заменяются NA (ваш вопрос показывает пробелы, в которых столбцы имеют два элемента против вас, но настоящий пробел невозможен вdata.frame, так как все строки должны быть заполнены чем-то, в этом случае NA, где пусто).Подход заключается в следующем: (1) использовать str_split для разделения ваших пар имя / значение на «_» и вернуть их во фрейм данных (2) использовать dcast, где значение имени является функцией строки вашего значения

library(reshape2)
head(df$V1)

df <- data.frame(V1=c("FOO1_Yu","FOO1_uN","FOO2_Yo","FOO2_yA","FOO10_nO","FOO10_Yes","FOO1_NoY"),stringsAsFactors = F)

splits <- lapply(df$V1,function(x)
  {
    if (!grepl("_",x)) 
    {
      print(paste("Skipping bad input=",x)) 
      return (NULL)
    } else { 
      pair <- unlist(strsplit(x,split="_"))
      name <- pair[1]
      value <- x
      return (data.frame(name=name,value=value)) 
    }
  })

splits <- do.call("rbind",splits)

df <- dcast(splits,value ~ name)

Результат выводится следующим образом:

      value     FOO1    FOO2     FOO10
1   FOO1_Yu  FOO1_Yu    <NA>      <NA>
2   FOO1_uN  FOO1_uN    <NA>      <NA>
3   FOO2_Yo     <NA> FOO2_Yo      <NA>
4   FOO2_yA     <NA> FOO2_yA      <NA>
5  FOO10_nO     <NA>    <NA>  FOO10_nO
6 FOO10_Yes     <NA>    <NA> FOO10_Yes
7  FOO1_NoY FOO1_NoY    <NA>      <NA>
...