2015-05-06 6 views
10

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

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 

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

+1

'data.frame (col1 = 1: 4)' даст вам "ожидаемый выход" – Jeff

+3

@Jeff, но он хочет передать ' "col1"' от переменной – shadowtalker

+0

Кстати, у меня есть помечен этот вопрос для перемещения в Stack Overflow, поскольку речь идет о программировании в R, а не о статистике. – shadowtalker

ответ

14

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

Вместо того, что вы можете сделать, это:

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. Выяснение того, почему это выражение работает и имеет смысл, будет хорошим упражнением.

+3

Также есть 'setNames' из' base R' – akrun

0

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

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

Это действительно очень плохой способ сделать это. Разбор произвольных текстовых значений опасен и его следует избегать. – MrFlick

+0

@MrFlick Действительно. – Zach

3

В дополнение к ответу 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