#r #data.table
Вопрос:
Можно ли условно записать данные во внешний файл из data.table ? В настоящее время используется basic для цикла, а затем для доступа к строкам/столбцам, но это очень медленно.
for (row in seq_len(nrow(dt))) {
<if - else condition by accessing row and column as dt[row, column]>
write(<text>, file=<file>, append=append)
}
Существуют очень сложные условия, и их нелегко преобразовать, а затем использовать fwrite для сброса выходных данных из data.table во внешний файл (при условии, что это самый быстрый вариант).
Мне просто интересно, будет ли поддержка data.table «set» быстрее (пример из одного из блогов, как показано ниже), чем базовая для цикла, но тогда как мы можем выполнить fwrite() из «набора» data.table ?
dt <- data.table(mtcars)[,1:5, with=F]
for (j in c(1L,2L,4L)) set(dt, j=j, value=-dt[[j]]) # integers using 'L' passed for efficiency
for (j in c(3L,5L)) set(dt, j=j, value=paste0(dt[[j]],'!!'))
head(dt)
Комментарии:
1. Честно говоря, я подозреваю, что выполнение этого по порядку примерно так же неэффективно (с точки зрения R-эффективности), как и возможно. Я предлагаю сделать
if
это за один шаг и записать полученные строки за один шаг. Я также не вижу, как ваш первый блок (перебор строк, запись по одной строке за раз) связан с вашим вторым блоком (перебор столбцов,set
чтобы соответствующим образом обновить каждый столбец). Как эти два понятия соотносятся? В конечном счете, какова ваша необходимая операцияdt
и<file>
?2. код @r2evans, показанный в двух блоках, предназначен только для справки, и я согласен, что один по строке, а другой по столбцу. Я больше ищу решение по строкам. Я не рассматриваю возможность обработки всего в data.table, а затем сброса выходных данных с помощью fwrite().
Ответ №1:
Нам просто нужно заблокировать код {}
, т. Е. После того, как мы применим set
, исходный набор данных » dt » будет обновлен. Затем мы используем fwrite
преобразованный набор данных с новым именем файла
library(data.table)
for(i in seq_len(nrow(dt))) {
for (j in c(1L,2L,4L)) {
set(dt, i = i, j=j, value=-dt[[j]][i])
fwrite(dt, 'yourfile.csv', append = TRUE)
}
}
Комментарии:
1. Спасибо, моя ситуация заключается в том, чтобы получить контроль на уровне строк, а затем условно обработать, а затем записать содержимое этой строки в файл CSV. т. е. обрабатывать по одной строке за раз
2. @R007, где вы хотите
fwrite
, чтобы это было написано. Это всего лишь один файл после всей обработки? Затем вы можете выйти заfwrite
пределы цикла. Ваш код »write(<text>, file=<file>, append=append
показывает, что он написан в цикле3. да, один файл. Я обычно пишу() с добавлением=TRUE
4. @R007 затем просто измените имя файла, как в обновлении, т. е. одно имя файла и используйте
append = TRUE
(которое также есть вfwrite
5. @R007 Если вы зацикливаетесь на строках, то
i
не указано