数据框中变量作为列名

46
有没有办法在新数据帧中使用变量中存储的字符串作为列名?预期结果应为:
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]来引用现有对象中的列名,但我想知道是否有其他解决方案可在创建数据框时使用。


2
data.frame(col1 = 1:4) 将会给你以下的"期望输出"。 - Jeff
9
@Jeff 但他想从一个变量中传递“col1”。 - shadowtalker
顺便说一下,我已经标记了这个问题,以移动到Stack Overflow,因为它是关于R编程而不是统计学。 - shadowtalker
哦,是的,抱歉我读错了,你的回答在这种情况下覆盖了一切。(+1) - Jeff
3个回答

41

你不能像那样将一个变量传递到参数名中。

相反,你可以这样做:

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

还有magrittr包中的set_names函数,您可以使用它来一步完成此最后一种解决方案:

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

但是set_names只不过是以下命令的别名:

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

这是R语言基础的一部分。弄清楚这个表达式为什么有效并有意义将是一个很好的练习。


4
另外,还有来自基础R的setNames函数。 - akrun

6
除了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

0

我不建议你这样做,但是:

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

4
这确实是一种非常糟糕的做法。解析任意文本值是危险的,应该避免使用。 - MrFlick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接