Сначала вам нужно get
нужных вам объектов и сохранить их вместе в виде списка;если вы можете создать их имена как строки, вы используете функцию get
.Здесь я создаю две переменные, A
и B
:
> A <- 1:4
> B <- rep(LETTERS[1:2],2)
Затем я создаю вектор символов, содержащий их имена (сохраненные как ns
), и get
этих переменных, используя lapply
.Затем я устанавливаю имена в списке такими же, как их исходные имена.
> (ns <- LETTERS[1:2])
[1] "A" "B"
> obj.list <- lapply(ns, get)
> names(obj.list) <- ns
> obj.list
$A
[1] 1 2 3 4
$B
[1] "A" "B" "A" "B"
Тогда вы можете использовать do.call
;первый аргумент - это функция, которую вы хотите, а второй - список с аргументами, которые вы хотите передать ей.
> do.call(cbind, obj.list)
A B
[1,] "1" "A"
[2,] "2" "B"
[3,] "3" "A"
[4,] "4" "B"
Однако, как правильно отмечает aL3xa, это создает матрицу, а не фрейм данных,что может быть не тем, что вы хотите, если переменные разных классов;здесь мой A
был приведен к символьному вектору вместо числового вектора.Чтобы создать фрейм данных из списка, вы просто вызываете data.frame
;затем классы переменных сохраняются.
> (AB <- data.frame(obj.list))
A B
1 1 A
2 2 B
3 3 A
4 4 B
> sapply(AB, class)
A B
"integer" "factor"
> str(AB)
'data.frame': 4 obs. of 2 variables:
$ A: int 1 2 3 4
$ B: Factor w/ 2 levels "A","B": 1 2 1 2