Таким образом, у меня есть скрипт для импорта большого количества данных, хранящихся в нескольких текстовых файлах. В одном файле не все строки должны быть помещены в одну и ту же таблицу (DF теперь переключается на DT), поэтому для каждого файла я выбираю все строки, принадлежащие одному и тому же DF, get
DF и assign
к нему ряды.
В первый раз, когда я создаю DF с именем, скажем, table1, я делаю:
name <- "table1" # in my code the value of name will depend on different factors
# and **not** known in advance
assign(name, someRows)
Затем во время выполнения мой код может найти (в других файлах) другие строки для помещения во фрейм данных table1, поэтому:
name <- "table"
assign(name, rbindfill(get(name), someRows))
Мой вопрос: является ли assign(get(string), anyObject)
лучшим способом для выполнения присваивания программно? Спасибо
РЕДАКТИРОВАТЬ:
вот упрощенная версия моего кода: (каждый элемент в dataSource
является результатом read.table()
, поэтому один текстовый файл)
set.seed(1)
#
dataSource <- list(data.frame(fileType = rep(letters[1:2], each=4),
id = rep(LETTERS[1:4], each=2),
var1 = as.integer(rnorm(8))),
data.frame(fileType = rep(letters[1:2], each=4),
id = rep(LETTERS[1:4], each=2),
var1 = as.integer(rnorm(8))))
# # #
#
library(plyr)
#
tablesnames <- unique(unlist(lapply(dataSource,function(x) as.character(unique(x[,1])))))
for(l in tablesnames){
temp <- lapply(dataSource, function(x) x[x[,1]==l, -1])
if(exists(l)) assign(l, rbind.fill(get(l), rbind.fill(temp))) else assign(l, rbind.fill(temp))
}
#
#
# now two data frames a and b are crated
#
#
# different method using rbindlist in place of rbind.fill (faster and, until now, I don't # have missing column to fill)
#
rm(a,b)
library(data.table)
#
tablesnames <- unique(unlist(lapply(dataSource,function(x) as.character(unique(x[,1])))))
for(l in tablesnames){
temp <- lapply(dataSource, function(x) x[x[,1]==l, -1])
if(exists(l)) assign(l, rbindlist(list(get(l), rbindlist(temp)))) else assign(l, rbindlist(temp))
}
get
, ниassign
. Если бы вы привели воспроизводимый пример, люди могли бы показать вам лучший способ работы с вашими данными. - person Roland   schedule 14.05.2013rbindlist
/rbindfill
, а такжеassign
иget
. Вашrbinds
и двойное копирование вtemp
, вероятно, очень важны для производительности. Я могу ошибаться; Я не компьютерщик. Извините за неясность. - person Frank   schedule 14.05.2013data.frame
илиdata.table
. Имеет ли это смысл? (temp
— это список всех импортированных текстовых файлов) - person Michele   schedule 14.05.2013do.call(rbind,lapply(my_list,get))
или что-то подобное. На самом деле, я довольно часто делал это (с экспортированными из SAS CSV-файлами) в последнее время, связывая воедино серию наборов данных с немного разными переменными, собираемыми каждый год. Если мы все еще неправильно понимаем ваш вопрос, может быть, вы могли бы попробовать разделить его на более мелкие вопросы? - person Frank   schedule 14.05.2013df
как есть. Как я уже сказал, я думал, что понял, я перепишу вопрос, моя вина. - person Michele   schedule 14.05.2013