2017-02-15 3 views
0

У меня есть данные, подобные этим:Как создать таблицу данных путем объединения программно названных векторов?

number_of_runs <- 4 
r1 <- c(1,2,3) 
r2 <- c(4,5,6) 
r3 <- c(7,8,9) 
r4 <- c(10,11,12) 

Я регулярно имеют разное число прогонов (сохраненных в виде трех чисел в векторе имени r1 для первого запуска, r2 для второго запуска и т.д.). Я хотел бы объединить эти векторы в data.table, но поскольку количество пробегов варьируется, мне нужно сделать это программно.

Ниже отлично работает для заданного числа прогонов выводя dt точно так, как мне это нужно:

dt <- data.table(r1,r2,r3,r4) 

мне нужно что-то похожее на это ниже, но это на самом деле работает:

dt <- data.table(c(paste0("r", 1:number_of_runs))) 

Таким образом, если есть 3 прогона, он выведет таблицу данных, например data.table(r1,r2,r3), и если будет 4 прогона, она выведет таблицу данных, например data.table(r1,r2,r3,r4) и так далее.

Я использую data.table версию 1.10.4 на компьютере с Windows 7. Я ценю ваши идеи по этому поводу.

+4

Откуда взялись векторы 4 'r *'? Построение разных переменных со связанной информацией - не лучший способ сделать что-то. Вероятно, это должно быть в списке, который упрощает работу. Но проблема, с которой вы сталкиваетесь, заключается в том, что вы не можете заменить символы (вещи без кавычек) символьными значениями (это то, что возвращает 'paste0()'). – MrFlick

+0

@MrFlick Я не привязан к использованию векторов для 4 'r *'. Как бы вы предложили создать 4 'r *' в списке для решения этой проблемы? Благодарю. – FG7

+1

Ну, как вы их создали в первую очередь? Вы выполняли функцию 4 раза? Возможно, что-то вроде 'r <- replicate (4, roll())'. Или просто используя эти значения буквально, 'r <- list (c (1,2,3), c (4,5,6), c (7,8,9), c (10,11,12))' , Затем вы можете получить их с помощью 'r [[1]]', 'r [[2]]' и т. Д. И можете использовать 'do.call (" data.table ", r)', но только в данных. Таблица. – MrFlick

ответ

1

Как отметил @MrFlick, было бы намного проще, если бы векторы r* были сохранены в лучшем формате. Например, они могут быть помещены непосредственно в таблицу данных. Или, если они были в списке под названием «rList», тогда ваш ответ будет просто использовать as.data.table(rList). Поэтому вам действительно нужно переоценить, как вы создали эти переменные. Пожалуйста, поделитесь этим кодом с нами!

Для полноты, однако, есть способ сделать именно то, что вы просили: начать с символьного вектора переменных и объединить переменные с этими именами в текущей среде в data.table.

library(data.table) 
# say we must start with these vectors flaoting around the global environment 
r1 <- c(1,2,3) 
r2 <- c(4,5,6) 
r3 <- c(7,8,9) 
r4 <- c(10,11,12) 
number_of_runs <- 4 

# collect their names in a character vector as you have done: 
rNames <- paste0("r", 1:number_of_runs) 
# collapse them into one string 
rNamesCollapsed <- paste(rNames, collapse = ", ") 
# form the command we need to switch to create the data.table, still as a character vector: 
commandString <- paste0("data.table(", rNamesCollapsed , ")") 
# parse the character vector command into an R expression: 
commandExpr <- parse(text = commandString) 
# evaluate the expression to get the data.table: 
dt <- eval(commandExpr) 

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

Очевидно, что весь этот код можно сократить, но я хотел сломать то, что происходило. Как предложил @Roland, более короткий и лучший способ - использовать mget, который напрямую ищет переменные с заданными именами и возвращает их в списке с соответствующим именем.

# collect their names in a character vector as you have done: 
rNames <- paste0("r", 1:number_of_runs) 
# search the environment for objects with those names, and put them into a list: 
rList <- mget(rNames) 
# convert the list to a data.table: 
dt <- as.data.table(rList) 
+0

Даунвитирование для анализа проанализированного текста. Если у вас есть такие векторы, используйте mget, чтобы собрать их в список и перейти оттуда. – Roland

+0

Я был никем из-за ответа на вопрос? – mb7744

+0

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

Смежные вопросы