2016-08-14 4 views
1

У меня есть несколько data.tables, каждый из которых содержит 10 + столбцов, состоящий из ~ 4 ключевых (столбцов) и оставшихся столбцов. При печати в файл журнала я хотел бы напечатать ключи как есть, пока значения должны быть отформатированы. Например,форматирование data.table output

require(data.table) 
NF <- function(x) { return(format(x,big.mark=",",trim=TRUE,scientific=FALSE)) } 

dt <- data.table(c1=c("a","b"),c2=c("c","d"),c3=c("e","f"),c4=c(123456,432156), 
       c5=c(4839384,83473948)) 
cbind(dt[, 1:3, with=F], dt[, lapply(.SD,NF), .SDcols=4:5]) #desired output 

Как я могу написать это без необходимости связывать и делать два вызова на dt? Я не хочу сохранять форматированные значения в таблице данных. Это только для файла журнала. Мои таблицы большие, и я бы предпочел не копировать их.

+0

И почему бы не «персистировать» их? После этого вы можете сбросить их с помощью:: = NULL. И если это наносит ущерб вашим ограничениям памяти (что кажется маловероятным), возможно, обратите внимание, что на самом деле вам не нужно форматировать все строки, если вы просто смотрите на вывод консоли, который по умолчанию печатает 10 строк (пять сверху и снизу) ... – Frank

+0

В вашем конкретном примере все числовые столбцы отформатированы, поэтому вы можете просто применить функцию format к столбцам _all_ как 'df [, lapply (.SD, NF)]'. Это может не помочь в вашей реальной проблеме, и в этом случае вам следует обновить свой пример, чтобы отразить это (например, добавить числовой столбец, который вы не хотите форматировать). – Jerzy

ответ

0

Это работает?

#example data 
blah <- data.table(a=letters[1:10],b=letters[3:12],c=letters[5:14],d=c(1:7,12,32,13)*1000,e=c(1,5,6,7,8,3,2,5,1,4)*1000) 
#define key values 
indx<-c('a','b','c') 

write.csv(blah[,lapply(.SD, function(x) {format(x,big.mark = ',',trim=TRUE,scientific = FALSE)}),.SDcols=names(blah)[!names(blah)%in%indx],by=indx],file='yourfile.csv') 
Смежные вопросы