Сохранить имена векторов в качестве имен столбцов данных - PullRequest
3 голосов
/ 30 ноября 2011

В моем коде я заполняю столбцы информационного кадра векторами, как показано ниже:

df1[columnNum] <- barWidth

Это прекрасно работает, за исключением одного: мне нужно имя переменной вектора (barWidth выше) для сохранения в качестве заголовка столбца, по одному столбцу за раз.Кроме того, я не хочу использовать cbind.Это значительно замедляет выполнение моего кода.Следовательно, я использую предварительно выделенный фрейм данных.

Можно ли это сделать в назначении вектор-столбец?Если нет, то как я могу изменить это после факта?Я не могу найти правильный синтаксис, чтобы сделать это с colNames().

TIA

Ответы [ 3 ]

2 голосов
/ 30 ноября 2011

Это делается функцией [<-.data.frame.Можно предположить, что он может быть заменен на тот, который рассматривает название аргумента, но это такая фундаментальная функция, что я буду колебаться.Более того, похоже, что отвращение к этой практике сигнализирует этот код в верхней части определения функции:

> `[<-.data.frame`
function (x, i, j, value) 
{
    if (!all(names(sys.call()) %in% c("", "value"))) 
        warning("named arguments are discouraged")
    nA <- nargs()
    if (nA == 4L) {
 <snipped rest of rather long definition>

Я не знаю, почему это так, но это так.Возможно, вам следует подумать об использовании names<- после назначения столбцов или об использовании этого метода:

> dfrm["barWidth"] <- barWidth

> dfrm
  a V2 barWidth
1 a  1        1
2 b  2        2
3 c  3        3
4 d  4        4

Это можно обобщить в виде списка новых столбцов:

dfrm <- data.frame(a=letters[1:4])
barWidth <- 1:4
newcols <- list(barWidth=barWidth, bw2 =barWidth)
dfrm[names(newcol)] <- newcol
dfrm
#
  a barWidth bw2
1 a        1   1
2 b        2   2
3 c        3   3
4 d        4   4
1 голос
/ 30 ноября 2011

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

namevec <- c(...,"barWidth"...,)
columnNums <- c(...,10,...)

df1[columnNums[i]] <- get(namevec[i])
names(df1)[columnNums[i]] <- namevec[i]

или даже

columnNums <- c(barWidth=4,...)
for (i in seq_along(columnNums)) {
   df1[columnNums[i]] <- get(names(columnNums)[i])
}
names(df1)[columnNums] <- names(columnNums)

, но более глубокий вопросбудет откуда этот набор векторов в первую очередь: вы могли бы иметь их все время в списке?

0 голосов
/ 30 ноября 2011

Я бы просто использовал cbind():

 df1 <- cbind( df1, barWidth )

, который сохраняет имя.Однако в конечном итоге это будет последний столбец в df1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...