有没有办法将变量中存储的字符串用作新数据框中的列名?预期结果应为:
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] 作为现有对象,但是我想知道在创建数据框期间是否还有其他解决方案可供使用。
答案 0 :(得分:23)
您不能将变量传递给参数名称。
相反,你可以做的是:
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的一部分。弄清楚为什么这个表达有效并且有意义将是一个很好的练习。
答案 1 :(得分:4)
除了ssdecontrol的回答,还有第二种选择。
您正在寻找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
。首先将名称分配给变量,然后将值赋给先前分配的变量。之后,mget将评估字符串并将其传递给data.frame。
.csv
答案 2 :(得分:0)
我不建议你这样做,但是:
col.name <- 'col1'
eval(parse(text=paste0('data.frame(', col.name, '=1:4)')))