Переменная как имя столбца в кадре данных

Можно ли использовать строку, хранящуюся в переменной, как имя столбца в новом фрейме данных? Ожидаемый результат:

col.name <- 'col1'
df <- data.frame(col.name=1:4)
print(df)

# Real output
  col.name
1        1
2        2
3        3
4        4

# Expected output
  col1
1    1
2    2
3    3
4    4

Я знаю, что я могу создать фрейм данных, а затем использовать names() для переименования столбца или использовать df [, col.name] для существующего объекта, но я хотел бы знать, есть ли другое решение, которое могло бы во время создания кадра данных.

Ответ 1

Вы не можете передать переменную в имя такого аргумента.

Вместо этого вы можете сделать следующее:

df <- data.frame(placeholder_name = 1:4)
names(df)[names(df) == "placeholder_name"] <- col.name

или используйте имя по умолчанию "V1":

df <- data.frame(1:4)
names(df)[names(df) == "V1"] <- col.name

или присвоить положением:

df <- data.frame(1:4)
names(df)[1] <- col.name

или если у вас есть только один столбец, просто замените весь атрибут names:

df <- data.frame(1:4)
names(df) <- col.name

Также существует функция set_names в пакете magrittr, которую вы можете использовать для последнего решения за один шаг:

library(magrittr)
df <- set_names(data.frame(1:4), col.name)

Но set_names является просто псевдонимом для:

df <- `names<-`(data.frame(1:4), col.name)

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

Ответ 2

В дополнение к ответу ssdecontrol есть второй вариант.

Вы ищете mget. Сначала назначьте имя переменной, а затем значение переменной, которую вы ранее назначили. После этого mget проверит строку и передаст ее в data.frame.

assign(col.name, "col1")
assign(paste(col.name), 1:4)

df <- data.frame(mget(col.name))
print(df)
  col1
1    1
2    2
3    3
4    4

Ответ 3

Я не рекомендую вам это делать, но:

col.name <- 'col1'
eval(parse(text=paste0('data.frame(', col.name, '=1:4)')))