从一个数据表列中提取不同的数据,然后插入到R中的其他递增列中

时间:2018-07-20 01:52:57

标签: r

我是R语言的初学者,现在我正在处理数据表。所以以下是我的问题。我有一个看起来像这样的数据表(ls),将来它可以x个子文件夹,并且我编写了直到3个子文件夹的代码:

                            V1           nsubfolders
  1: CCData/EQHazGIS/Eqattcc.dat            2
  2: TWData/HUVuln/ea/modifsWI5.tw          3
  3: TWData/HUVul/ea/pa/modifsWI8.tw        4
  4: TWData/HUVul1/ea/pa/lk/modifsWI9.tw    5

nsubfolders会变成x数,所以基本上第一列显示了保存文件的路径,第二列显示了要访问该文件必须移动的文件夹数,并且可以有x数子文件夹中的数据,现在数据到5。例如,如果nsubfolder为2,则我必须穿过目录中的2个子文件夹才能到达文件。现在,我的部分是提取每个子文件夹的名称(从第一列$ V1开始),即``/''之前和之后的数据,然后根据子文件夹的数量将其放入新的附加列中。因此,第一个新列的第一个字符串应在“ /”之前,第二个新列的第二个字符串应在“ /”之后,第三个新列的第二个字符串应在第二个“ /”之前..依此类推。 o / p应该看起来像这样:

                             V1  nsubfolders v2    v3      v4  v5 v6 v7
  1: CCData/EQHazGIS/Eqattcc.dat           2 CCdata EQHazGIS NA NA NA dat 
  2:  TWData/HUVuln/ea/modifsWI7.tw        3 TWData HUVuln   ea NA NA TW
  3:  TWData/HUVul/ea/pa/modifsWI8.tw      4 TWData HUVul    ea pa NA TW  
  4:  TWData/HUVul1/ea/pa/lk/modifsWI9.tw  5 TWData HUVul1   ea pa lk TW

,对于文件名,我只需要文件的扩展名,即(dat或CN),并且必须是最后一列。如果没有数据,则应显示NA。我编写了以下代码来检查直到3个子文件夹,但数据不正确,在col v4和V8中显示了“ NA”,在直到2个子文件夹中,v2和v3中的o / p都是正确的,但是之后开始重复自身,因此一旦代码可以使用到3个文件夹,我就可以继续执行直到x个子文件夹。 即使经过大量研究,我也无法弄清原因,而且,我知道以下代码不是实现此目的的最佳和有效方法,请查看以下代码,并让我知道您的宝贵建议和有效方法到它:

#Global variables

filesPath <-"//ca1ntap01/Transfer/2Anuj/Data/" # this is directory where all the folders are kept

#creating a datatable
require(data.table)

ls<-as.data.table(list.files(filesPath,recursive=T,all.files = T,full.names = F
                             ,include.dirs = F))

e <- character()
f <- character()
g <- character()
j <- character()
n <- character()
o <- character()
p <- character()

for(i in 1:nrow(ls) )

{
  ls$nsubfolders<-sapply(regmatches(ls$V1, gregexpr("/", ls$V1)), length) #this gives the number of subfolders for every row
  a <- ls[i,1]
  print(a)
  b <- read.table(text = toString(a), sep = "/", as.is = TRUE)$V1
  print(b)
  c <- read.table(text = toString(a), sep = "/", as.is = TRUE)$V2
  print(c)
  e[i] <- b
  f[i] <- c
  #if (ls[nsubfolders=="2"])
  if (ls[ls$nsubfolders== 2])  
    {
    d <- read.table(text = toString(a), sep = "/", as.is = TRUE)$V3
    print(d)
    g[i] <- d
    h <- read.table(text = toString(d), sep = ".", as.is = TRUE)$V2
    print(h)
    print(i)
    j[i] <- h

  } else if (ls[ls$nsubfolders== 3]) {

    k <-read.table(text = toString(a), sep = "/", as.is = TRUE)$V3
    l <-read.table(text = toString(a), sep = "/", as.is = TRUE)$V4
    m <-read.table(text = toString(l), sep = ".", as.is = TRUE)$V2
    n[i] <- k
    o[i] <- l
    p[i] <- m
  }

}




# to add columns in the datatable
ls$V2 <- e
ls$V3 <- f
ls$V4 <- n
ls$V5 <- g
ls$V6 <- j
ls$V7 <- o
ls$V8 <- p

print(ls)

1 个答案:

答案 0 :(得分:0)

如果您必须计算n个子文件夹:

ext=sub(".*[.]","",dat$V1)
 dat1=read.table(text=sub("[^/]*$","",dat$V1),sep="/",fill=T,na.strings = "")
 nsubfolders=rowSums(!is.na(dat1))
 cbind(dat[-2],nsubfolders,dat1,ext)
                                   V1 nsubfolders     V1       V2   V3   V4   V5 ext
1         CCData/EQHazGIS/Eqattcc.dat           2 CCData EQHazGIS <NA> <NA> <NA> dat
2         CCData/EQHazGIS/eqcrhaz2.CN           2 CCData EQHazGIS <NA> <NA> <NA>  CN
3       TWData/HUVuln/ea/modifsWI5.tw           3 TWData   HUVuln   ea <NA> <NA>  tw
4     TWData/HUVul/ea/pa/modifsWI8.tw           4 TWData    HUVul   ea   pa <NA>  tw
5         CCData/EQHazGIS/eqcrhaz2.CN           2 CCData EQHazGIS <NA> <NA> <NA>  CN
6 TWData/HUVul1/ea/pa/lk/modifsWI9.tw           5 TWData   HUVul1   ea   pa   lk  tw