Указание имен столбцов из списка в команде data.frame

У меня есть список под названием cols с названиями столбцов в нем:

cols <- c('Column1','Column2','Column3')

Я бы хотел воспроизвести эту команду, но с обращением к списку:

data.frame(Column1=rnorm(10))

Вот что происходит, когда я пробую:

> data.frame(cols[1]=rnorm(10))

Error: unexpected '=' in "data.frame(I(cols[1])="

То же самое произойдет, если я заключу cols[1] в I() или eval().

Как я могу передать этот элемент из вектора в команду data.frame()?

Обновление:

Для некоторой предыстории я определил функцию calc.means(), которая принимает фрейм данных и список переменных и выполняет большую и сложную операцию ddply, подводя итоги на уровне, заданном переменными.

Что я пытаюсь сделать с помощью команды data.frame(), так это вернуться вверх по уровням агрегации до самого верха, повторно выполняя calc.means() на каждом шаге и используя rbind(), чтобы склеить результаты друг с другом. Мне нужно добавить фиктивные столбцы со значениями «Все», чтобы rbind работал правильно.

В основном я добавляю cast-подобные функции полей в ddply, и я не хотел бы повторно вводить имена столбцов для каждого запуска. Вот полный код:

cols <- c('Col1','Col2','Col3')
rbind ( calc.means(dat,cols),
    data.frame(cols[1]='All', calc.means(dat, cols[2:3])),
    data.frame(cols[1]='All', cols[2]='All', calc.means(dat, cols[3]))
)

person MW Frost    schedule 28.04.2010    source источник


Ответы (4)


Использование может использовать structure:

cols <- c("a","b")

foo <- structure(list(c(1, 2 ), c(3, 3)), .Names = cols, row.names = c(NA, -2L), class = "data.frame")

Я не понимаю, зачем вы это делаете!

person Eduardo Leoni    schedule 28.04.2010

Я не уверен, как это сделать напрямую, но вы можете просто пропустить этап назначения имен в команде data.frame (). Предполагая, что вы сохраняете результат data.frame () в переменной с именем foo, вы можете просто сделать:

names (foo) ‹- cols

после создания фрейма данных

person frankc    schedule 28.04.2010
comment
Да, это нормально работает, но data.frame() происходит внутри rbind(). Спасибо хоть. - person MW Frost; 28.04.2010
comment
Вы можете создать фрейм данных, назначить имена столбцов, а затем связать их с помощью rbind, все в одном предложении. - person Shane; 28.04.2010
comment
Шейн, как это сработает? Я не уверен, как передать объекты через процесс в одном предложении. - person MW Frost; 29.04.2010

Есть одна хитрость. Вы можете испортить списки:

cols_dummy <- setNames(rep(list("All"), 3), cols)

Затем, если вы используете вызов в список с одним пареном, вы должны получить то, что хотите

data.frame(cols_dummy[1], calc.means(dat, cols[2:3]))

Вы можете использовать его на лету как setNames(list("All"), cols[1]), но я думаю, что он менее элегантен.

Пример:

some_names <- list(name_A="Dummy 1", name_B="Dummy 2") # equivalent of cols_dummy from above
data.frame(var1=rnorm(3), some_names[1])
#        var1  name_A
# 1 -1.940169 Dummy 1
# 2 -0.787107 Dummy 1
# 3 -0.235160 Dummy 1
person Marek    schedule 28.04.2010

Я считаю, что функция assign () - это ваш ответ:

cols <- c('Col1','Col2','Col3')
data.frame(assign(cols[1], rnorm(10)))

Возврат:

   assign.cols.1...rnorm.10..
1                 -0.02056822
2                 -0.03675639
3                  1.06249599
4                  0.41763399
5                  0.38873118
6                  1.01779018
7                  1.01379963
8                  1.86119518
9                  0.35760039
10                 1.14742560

С помощью функции lapply () или sapply () вы сможете зациклить процесс cbind (). Что-то вроде:

operation <- sapply(cols, function(x) data.frame(assign(x, rnorm(10))))
final     <- data.frame(lapply(operation, cbind))

Возврат:

   Col1.assign.x..rnorm.10.. Col2.assign.x..rnorm.10.. Col3.assign.x..rnorm.10..
1                0.001962187                -0.3561499               -0.22783816
2               -0.706804781                -0.4452781               -1.09950505
3               -0.604417525                -0.8425018               -0.73287079
4               -1.287038060                 0.2545236               -1.18795684
5                0.232084366                -1.0831463                0.40799046
6               -0.148594144                 0.4963714               -1.34938144
7                0.442054119                 0.2856748                0.05933736
8                0.984615916                -0.0795147               -1.91165189
9                1.222310749                -0.1743313                0.18256877
10              -0.231885977                -0.2273724               -0.43247570

Затем, чтобы очистить имена столбцов:

colnames(final) <- cols

Возврат:

          Col1       Col2        Col3
1   0.19473248  0.2864232  0.93115072
2  -1.08473526 -1.5653469  0.09967827
3  -1.90968422 -0.9678024 -1.02167873
4  -1.11962371  0.4549290  0.76692067
5  -2.13776949  3.0360777 -1.48515698
6   0.64240694  1.3441656  0.47676056
7  -0.53590163  1.2696336 -1.19845723
8   0.09158526 -1.0966833  0.91856639
9  -0.05018762  1.0472368  0.15475583
10  0.27152070 -0.2148181 -1.00551111

Ваше здоровье,

Адам

person Adam Erickson    schedule 31.10.2014