заполнить фрейм данных файлом file.info с помощью функции apply - PullRequest
0 голосов
/ 26 сентября 2018

Я хотел бы заполнить существующий пустой фрейм данных информацией о файле, используя список и функцию file.info.Я выполнял ту же задачу, используя цикл for, но хотел бы узнать, как использовать семейство apply, и подумал, что это будет хороший простой пример.

Мой список ...

listOfFiles_M <- c("I:\\temp\\APIS2//APIS01/WAV/APIS01_20170414_150000.wav", "I:\\temp\\APIS2//APIS01/WAV/APIS01_20170414_160000.wav", 
"I:\\temp\\APIS2//APIS01/WAV/APIS01_20170414_170000.wav", "I:\\temp\\APIS2//APIS01/WAV/APIS01_20170414_180000.wav"
)

Мой пустой фрейм данных ...

m_files <- structure(list(size = numeric(0), isdir = logical(0), mode = structure(integer(0), class = "octmode"), 
    mtime = structure(numeric(0), class = c("POSIXct", "POSIXt"
    )), ctime = structure(numeric(0), class = c("POSIXct", "POSIXt"
    )), atime = structure(numeric(0), class = c("POSIXct", "POSIXt"
    )), exe = character(0)), .Names = c("size", "isdir", "mode", 
"mtime", "ctime", "atime", "exe"), row.names = character(0), class = "data.frame")

Моя функция ...

test.info <- function(i,x){
  print (i)
  x[i,]=c(file.info(i))
}

ИЯ подумал, что должен использовать lapply таким образом ...

lapply(listOfFiles_M, test.info)

И вот пример того, как я хотел бы, чтобы населенный m_files выглядел ...

m_files <- structure(list(rn = c("I:\\temp\\APIS2//APIS01/WAV/APIS01_20170414_150000.wav", 
"I:\\temp\\APIS2//APIS01/WAV/APIS01_20170414_160000.wav", "I:\\temp\\APIS2//APIS01/WAV/APIS01_20170414_170000.wav", 
"I:\\temp\\APIS2//APIS01/WAV/APIS01_20170414_180000.wav"), size = c(9601276, 
9601276, 9601276, 9601276), isdir = c(FALSE, FALSE, FALSE, FALSE
), mode = structure(c(438L, 438L, 438L, 438L), class = "octmode"), 
    mtime = structure(c(1492200300, 1492203900, 1492207500, 1492211100
    ), class = c("POSIXct", "POSIXt")), ctime = structure(c(1537974713.78911, 
    1537974713.85152, 1537974713.89832, 1537974713.92952), class = c("POSIXct", 
    "POSIXt")), atime = structure(c(1537974713.78911, 1537974713.85152, 
    1537974713.89832, 1537974713.92952), class = c("POSIXct", 
    "POSIXt")), exe = c("no", "no", "no", "no")), .Names = c("rn", 
"size", "isdir", "mode", "mtime", "ctime", "atime", "exe"), row.names = c(NA, 
-4L), class = "data.frame")

РЕДАКТИРОВАТЬ: Я должен был также упомянуть, что есть большой список, ~ 200 000 пунктов, поэтому rbind, вероятно, не является хорошим решением.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Просто передайте свой список файлов в file.info, который может получить более 1 значения в качестве входных данных и возвращает фрейм данных в соответствии с документами, ?file.info.

final_df <- file.info(listOfFiles_M)

Нет необходимости инициализировать пустой фрейм данных и отображать в него значения или rbind итеративно возвращаемые объекты.

0 голосов
/ 26 сентября 2018

Я предполагаю, что функция file.info предназначена для того, чтобы взять имя файла и затем выдать вектор длины 7, который вы используете для заполнения строки.

Просто рекомендация, это немного сложно проверить, когда у нас нет вывода функции file.info хотя бы для одного файла.Поэтому я бы порекомендовал упростить ваш фрейм данных m_files при публикации.

Я считаю, что единственная проблема заключается в том, что вам нужно указать аргумент x в своем приложении.

 lapply(listOfFiles_M, test.info, x = m_files)

...Аргумент в apply предназначен для того, чтобы вы перечислили другие дополнения, которые могут понадобиться функции, которую вы передаете, в данном случае это test.info.

...