У меня есть большая таблица данных (9 млн строк) с двумя столбцами: fcombined и значение fcombined — это фактор, но на самом деле это результат взаимодействия двух факторов. Теперь возникает вопрос, как наиболее эффективно снова разделить столбец с одним фактором на два? Я уже придумал решение, которое работает нормально, но, возможно, есть более прямой способ, который я пропустил. Рабочий пример:
library(stringr)
f1=1:20
f2=1:20
g=expand.grid(f1,f2)
combinedfactor=as.factor(paste(g$Var1,g$Var2,sep="_"))
largedata=1:10^6
DT=data.table(fcombined=combinedfactor,value=largedata)
splitfactorcol=function(res,colname,splitby="_",namesofnewcols){#the nr. of cols retained is length(namesofnewcols)
helptable=data.table(.factid=seq_along(levels(res[[colname]])) ,str_split_fixed(levels(res[[colname]]),splitby,length(namesofnewcols)))
setnames(helptable,colnames(helptable),c(".factid",namesofnewcols))
setkey(helptable,.factid)
res$.factid=unclass(res[[colname]])
setkey(res,.factid)
m=merge(res,helptable)
m$.factid=NULL
m
}
splitfactorcol(DT,"fcombined",splitby="_",c("f1","f2"))
str_split_fixed function not found
- person Arun   schedule 14.06.2013DT[, c("a1", "a2") := as.data.frame(do.call(rbind, strsplit(as.character(fcombined), "_")), stringsAsFactors=FALSE)]
(а затем преобразоватьa1
иa2
в типnumeric
). Хотя не уверен, что будет быстрее. - person Arun   schedule 14.06.2013str_split_fixed
находится в библиотеке (stringr) - person Johannes Kutsam   schedule 14.06.2013colsplit
в пакетеreshape2
делает это, но начинает только с вектора (столбец для разделения) и возвращаетdata.frame
, который можноcbind
преобразовать обратно в исходные данные. Он не работает вdata.table
напрямую, поэтому я не знаю, насколько он будет эффективен. Но стоит рассмотреть/сопоставить. - person Brian Diggs   schedule 14.06.2013m[,".factid":=NULL]
. Точно так же вы можете создать res$.factid по ссылке:res[".factid":=unclass(get(colname))]
или что-то в этом роде. И с setnames, если вы переименовываете все, вы можете просто передать новые имена:setnames(helptable,new_names)
. - person Frank   schedule 14.06.2013