有没有办法使用存储在变量中的字符串作为新数据框中的列名?预期结果应该是:
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
Run Code Online (Sandbox Code Playgroud)
我知道我可以创建数据框,然后使用names()重命名列或使用df [,col.name]作为现有对象,但我想知道是否有任何其他解决方案可以在使用过程中使用创建数据框架.
sha*_*ker 27
您不能将变量传递给参数的名称.
相反,你可以做的是:
df <- data.frame(placeholder_name = 1:4)
names(df)[names(df) == "placeholder_name"] <- col.name
Run Code Online (Sandbox Code Playgroud)
或使用默认名称"V1":
df <- data.frame(1:4)
names(df)[names(df) == "V1"] <- col.name
Run Code Online (Sandbox Code Playgroud)
或按职位分配:
df <- data.frame(1:4)
names(df)[1] <- col.name
Run Code Online (Sandbox Code Playgroud)
或者,如果您只有一列,则只需替换整个names属性:
df <- data.frame(1:4)
names(df) <- col.name
Run Code Online (Sandbox Code Playgroud)
包中还有一个set_names功能magrittr,您可以用一步完成最后一个解决方案:
library(magrittr)
df <- set_names(data.frame(1:4), col.name)
Run Code Online (Sandbox Code Playgroud)
但set_names它只是一个别名:
df <- `names<-`(data.frame(1:4), col.name)
Run Code Online (Sandbox Code Playgroud)
这是基础R的一部分.弄清楚为什么这个表达有效并且有意义将是一个很好的练习.
除了 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
Run Code Online (Sandbox Code Playgroud)