Получить первый элемент из пути к файлу - PullRequest
1 голос
/ 20 февраля 2020

У меня есть вектор во фрейме данных

c("E:\\\\My Network Places.old.dat", "E:\\\\pagefile.sys", "E:\\\\Press_Dly_Diff_G_91.rbc", 
"E:\\\\TV_Press_Dly_Diff_A\\Retrospect\\Dantz", "E:\\\\TV_Press_Dly_Diff_A\\Retrospect\\TV_Press_Dly_Diff_A\\1-TV_Press_Dly_Diff_A\\AA000083.rdb", 
"E:\\\\TV_Press_Dly_Diff_A\\Retrospect\\TV_Press_Dly_Diff_A\\1-TV_Press_Dly_Diff_A\\AA000561.rdb"
)

Выше длина путей к файлам варьируется от 1 до 5. Я пытаюсь получить каждый уровень пути к файлу в столбце в фрейм данных. Я попытался с первой частью, используя следующее:

library(stringr)
df1$PF <- strsplit(df1$File.Name, "\\\\"))
df1$PFolder <- df1$PF[[1]][3]

Но я получаю только первое My Network Places.old.dat для всех строк во фрейме данных. Как разделить путь на несколько столбцов на основе разделителя \\ и сохранить его в отдельных столбцах внутри фрейма данных. Желаемый результат выглядит следующим образом:

File.Name         FilePath1         FilePath2       FilePath3

Указанный выше символьный вектор находится в File.Name во фрейме данных.

Ответы [ 3 ]

2 голосов
/ 20 февраля 2020

Мы можем использовать cSplit из splitstackshape

splitstackshape::cSplit(df, "path", "\\\\+", fixed = FALSE)

#   path_1                    path_2     path_3              path_4                path_5       path_6
#1:     E: My Network Places.old.dat       <NA>                <NA>                  <NA>         <NA>
#2:     E:              pagefile.sys       <NA>                <NA>                  <NA>         <NA>
#3:     E:   Press_Dly_Diff_G_91.rbc       <NA>                <NA>                  <NA>         <NA>
#4:     E:       TV_Press_Dly_Diff_A Retrospect               Dantz                  <NA>         <NA>
#5:     E:       TV_Press_Dly_Diff_A Retrospect TV_Press_Dly_Diff_A 1-TV_Press_Dly_Diff_A AA000083.rdb
#6:     E:       TV_Press_Dly_Diff_A Retrospect TV_Press_Dly_Diff_A 1-TV_Press_Dly_Diff_A AA000561.rdb

Или, если вы уже знаете, на сколько столбцов будут расширены данные, мы также можем использовать separate.

tidyr::separate(df, path, into = paste0('path', 1:6), sep = "\\\\+", fill = 'right')

данные

df <- data.frame(path = x, stringsAsFactors = FALSE)
1 голос
/ 20 февраля 2020

Вот базовое решение R с использованием strsplit, т. Е.

res <- data.frame(do.call(rbind,lapply(s <- strsplit(v,split = "\\\\+"),`length<-`,max(lengths(s)))))

, такое, что

> res
  X1                        X2         X3                  X4                    X5           X6
1 E: My Network Places.old.dat       <NA>                <NA>                  <NA>         <NA>
2 E:              pagefile.sys       <NA>                <NA>                  <NA>         <NA>
3 E:   Press_Dly_Diff_G_91.rbc       <NA>                <NA>                  <NA>         <NA>
4 E:       TV_Press_Dly_Diff_A Retrospect               Dantz                  <NA>         <NA>
5 E:       TV_Press_Dly_Diff_A Retrospect TV_Press_Dly_Diff_A 1-TV_Press_Dly_Diff_A AA000083.rdb
6 E:       TV_Press_Dly_Diff_A Retrospect TV_Press_Dly_Diff_A 1-TV_Press_Dly_Diff_A AA000561.rdb

ДАННЫЕ

v <- c("E:\\\\My Network Places.old.dat", "E:\\\\pagefile.sys", "E:\\\\Press_Dly_Diff_G_91.rbc", 
       "E:\\\\TV_Press_Dly_Diff_A\\Retrospect\\Dantz", "E:\\\\TV_Press_Dly_Diff_A\\Retrospect\\TV_Press_Dly_Diff_A\\1-TV_Press_Dly_Diff_A\\AA000083.rdb", 
       "E:\\\\TV_Press_Dly_Diff_A\\Retrospect\\TV_Press_Dly_Diff_A\\1-TV_Press_Dly_Diff_A\\AA000561.rdb"
)
1 голос
/ 20 февраля 2020

Импорт с разделителем - "\":

library(data.table)

fread("
E:\\\\My Network Places.old.dat
E:\\\\pagefile.sys
E:\\\\Press_Dly_Diff_G_91.rbc
E:\\\\TV_Press_Dly_Diff_A\\Retrospect\\Dantz
E:\\\\TV_Press_Dly_Diff_A\\Retrospect\\TV_Press_Dly_Diff_A\\1-TV_Press_Dly_Diff_A\\AA000083.rdb
E:\\\\TV_Press_Dly_Diff_A\\Retrospect\\TV_Press_Dly_Diff_A\\1-TV_Press_Dly_Diff_A\\AA000561.rdb", 
      sep = "\\", fill = TRUE, na.strings = "")

#    V1 V2                        V3         V4                  V5                    V6           V7
# 1: E: NA My Network Places.old.dat       <NA>                <NA>                  <NA>         <NA>
# 2: E: NA              pagefile.sys       <NA>                <NA>                  <NA>         <NA>
# 3: E: NA   Press_Dly_Diff_G_91.rbc       <NA>                <NA>                  <NA>         <NA>
# 4: E: NA       TV_Press_Dly_Diff_A Retrospect               Dantz                  <NA>         <NA>
# 5: E: NA       TV_Press_Dly_Diff_A Retrospect TV_Press_Dly_Diff_A 1-TV_Press_Dly_Diff_A AA000083.rdb
# 6: E: NA       TV_Press_Dly_Diff_A Retrospect TV_Press_Dly_Diff_A 1-TV_Press_Dly_Diff_A AA000561.rdb
...