функциональное выражение не работает как имя столбца в R

Я пытаюсь добавить новый столбец во фрейм данных с указанным именем столбца.

Это работает:

dat = data.frame(x1 = 1:10,
                 x2 = 101:110,
                 x3 = 1:2,
                 x4 = 2:1)

cbind(dat, 'x10' = 1:10)

Результат:

   x1  x2 x3 x4 x10
1   1 101  1  2   1
2   2 102  2  1   2
3   3 103  1  2   3
4   4 104  2  1   4
5   5 105  1  2   5
6   6 106  2  1   6
7   7 107  1  2   7
8   8 108  2  1   8
9   9 109  1  2   9
10 10 110  2  1  10

но использование функционального выражения в качестве имени столбца не работает

cbind(dat, paste0('x10', '_flag') = 1:10)

Ошибка: неожиданный '=' в "cbind (dat, paste0 ('x10', '_flag') ="

Я думал о

column_name = paste0('x10', '_flag')
cbind(dat, column_name = 1:10)

но в качестве имени столбца будет использоваться "column_name", а не строка, на которую он ссылается (спасибо @ 42- за исправление)

Как сообщить R, что paste0() - это просто строка? Я попробовал as.character(paste0()), но ничего не вышло. Любая помощь приветствуется. Спасибо!


person YJZ    schedule 25.08.2016    source источник
comment
К сожалению, второй метод не интерпретирует column_name, поэтому в итоге dat$column_name будет 1:10, а не то, на что вы надеялись. Выражения для имен аргументов не интерпретируются в паирлистах, данных функциям. Вы можете получить интерпретацию выражений, которые оцениваются в символьные значения с помощью assign (в первой позиции аргумента), но в конечном итоге это очень громоздкий вид кода и, как правило, означает, что есть лучшие альтернативы.   -  person IRTFM    schedule 25.08.2016


Ответы (1)


Вместо использования cbind вам следует научиться использовать "[", поскольку он принимает имена вычисляемых столбцов в позиции j-аргумента (после первой запятой):

> dat[ , paste0('x10', '_flag') ] = 1:10
> dat
   x1  x2 x3 x4 x10_flag
1   1 101  1  2        1
2   2 102  2  1        2
3   3 103  1  2        3
4   4 104  2  1        4
5   5 105  1  2        5
6   6 106  2  1        6
7   7 107  1  2        7
8   8 108  2  1        8
9   9 109  1  2        9
10 10 110  2  1       10

Это эквивалентно аналогичной стратегии с «[[»

dat[[ paste0('x10', '_flag') ]] = 1:10

Примечание: это позволяет избежать неудачных попыток новичков получить имена вычисляемых столбцов, присвоенные с помощью $

person IRTFM    schedule 25.08.2016