2016-11-28 1 views
1

У меня возникла проблема добавления нового столбца для каждого элемента списка, который будет содержать измененное имя этих файлов. До сих пор я могу указать substr для создания столбца имен файлов, но с другой стороны мне не удалось добавить новые строки в этот столбец, например, «лучшие» или «худшие» слова.Изменить имена файлов в списке файлов и добавить их в качестве нового столбца

Вот моя воспроизводимая попытка

Эта часть только для получения .txt файлы в рабочем каталоге!

writeFiles <- function(n, maxRows=10){ 
    lapply(seq(10,90,10),function(x) write.table(sample(sample(maxRows)[1],replace=F),paste(x,'.txt',sep=""), quote=FALSE, col.names = FALSE,row.names=FALSE)) 
}  
writeFiles(9,10) 

filesToProcess <- dir(pattern = "*\\.txt") 

"10.txt" "20.txt" "30.txt" "40.txt" "50.txt" "60.txt" "70.txt" "80.txt" "90.txt" 

В следующем шаге я буду читать эти файлы и изменять FileNames столбец, который только принимает первый символ из .txt файлов.

data.list <- lapply(filesToProcess,function(x){ 
    tmp <- read.table(file=x, header = F,fill=T, comment.char='*') 
# tmp$filenames <- paste0(substr(x,1,1),c("best","worst"),sep="") 
    tmp$filenames <- substr(x,1,1) 

    return(tmp) 
}) 

    data.list 
     [[1]] 
      V1 filenames 
     1 4   1 
     2 3   1 
     3 7   1 
     4 8   1 
     5 1   1 
     6 2   1 
     7 6   1 
     8 5   1 

     [[2]] 
      V1 filenames 
     1 4   2 
     2 1   2 
     3 5   2 
     4 3   2 
     5 2   2 
     6 6   2 
     7 7   2 

     [[3]] 
      V1 filenames 
     1 1   3 
     2 3   3 
     3 2   3 

и т.д.

В самом деле, я тоже хочу новые строки символов в filenames колонке, и я попытался вставить команду внутри lapply,

data.list <- lapply(filesToProcess,function(x){ 
    tmp <- read.table(file=x, header = F,fill=T, comment.char='*') 
    tmp$filenames <- paste0(rep(c("best","worst"),c(4,5)),substr(x,1,1),sep="") 
    return(tmp) 
}) 

Ошибка в $<-.data.frame (*tmp*, "имена файлов" , значение = c ("best1", # "best1",: замена имеет 9 строк, данные имеют 8

Итак, первые 4 .tx t файлы помечены как лучше всего, а оставшиеся 5 файлов - самые худшие .txt-файлы.

Как это сделать внутри lapply?

ответ

2

Мы можем подмножить первые четыре элемента «data.list», пройти через них, и transform столбец «filenames».

data.list[1:4] <- lapply(data.list[1:4], transform, filenames= paste0("best", filenames)) 

Точно так же можно сделать с оставшимися 5 list элементами

data.list[5:9] <- lapply(data.list[5:9], transform, filenames= paste0("worst", filenames)) 

Мы также можем сделать это с «filesToProcess» путем создания vector из «лучших», «худший ', а затем цикл через последовательность' filesToProcess '

v1 <- rep(c("best", "worst"), c(4, 5)) 
lapply(seq_along(filesToProcess),function(i){ 
    tmp <- read.table(file=filesToProcess[i], header = FALSE, fill=TRUE, comment.char='*') 
    tmp$filenames <- paste0(v1[i], substr(filesToProcess[i],1,1), sep="") 
    tmp 
    }) 
+0

Спасибо Akrun. Можем ли мы это сделать, не выходя из цикла? как я предлагаю. – Alexander

+1

@ Александр изменил код, пожалуйста, проверьте, работает ли это – akrun

+1

Hi Akrun. Спасибо чувак. Работает отлично, как всегда :) – Alexander

Смежные вопросы