Используйте tidyr::разделять по столбцу с переменным количеством символов-разделителей

#r #tidyr

Вопрос:

Мне нужно проанализировать столбец, созданный из имен папок. В некоторых папках было много вложенных папок, что приводило к переменной величине «/» в названии. Как я могу разделиться на «/» и получить множество столбцов, в некоторых из которых будет «NA», если не было вложенных папок?

Репрекс:

 df <- data.frame(group = c("a", "b", "c"), var1 = c(3, 1, 2), 
            id = c("C:/Users/me/big_folder/little_folder/plot/783/abc/551/statistics.csv",
                   "C:/Users/me/big_folder/little_folder/plot/rep/634/efg/552/statistics.csv", 
                   "C:/Users/me/big_folder/228/hij/553/statistics.csv"))  

separate(df, id, sep = "/", into = c(a, b, c, d, e, f, g, h, i, j))
 

Комментарии:

1. Вам нужен вектор строк, так как into аргумент также является sep т. е. separate(df, "id", sep = "/", into = letters[1:10])

Ответ №1:

Согласно с ?separate

в — Имена новых переменных для создания в качестве вектора символов. Используйте NA, чтобы опустить переменную в выводе.

Текущие коды операции используются into без кавычек. Либо используйте встроенный вектор letters

 library(tidyr)
separate(df, "id", sep = "/", into = letters[1:10])
 

или использовать

 separate(df, "id", sep = "/", into = 
        c("a", "b", "c", "d", "e", "f", "g", "h", "i", "j"))
 

-выход

  group var1  a     b  c          d             e    f   g              h    i              j
1     a    3 C: Users me big_folder little_folder plot 783            abc  551 statistics.csv
2     b    1 C: Users me big_folder little_folder plot rep            634  efg            552
3     c    2 C: Users me big_folder           228  hij 553 statistics.csv <NA>           <NA>
 

Ответ №2:

В случае, если вы ищете альтернативы: Мы могли бы использовать cSplit из splitstackshape пакета. Преимущество заключается в том, что нам не нужно определять результирующие столбцы перед:

 library(splitstackshape)
cSplit(df, "id", "/")
 

выход:

    group var1 id_01 id_02 id_03      id_04         id_05 id_06 id_07          id_08 id_09          id_10          id_11
1:     a    3    C: Users    me big_folder little_folder  plot   783            abc   551 statistics.csv           <NA>
2:     b    1    C: Users    me big_folder little_folder  plot   rep            634   efg            552 statistics.csv
3:     c    2    C: Users    me big_folder           228   hij   553 statistics.csv  <NA>           <NA>           <NA>