从文件路径中获取第一个元素

问题描述 投票:1回答:3

我的向量在数据帧中

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中。

r filepath
3个回答
2
投票

我们可以使用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
投票

使用分隔符导入-"\"

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

1
投票

这里是使用strsplit的基本R解,>

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

DATA

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"
)
© www.soinside.com 2019 - 2024. All rights reserved.