问题很简单但我无法找到解决方案。
我想创建一个新的数据框,用paste0
定义列的名称。
理想情况下,我想做这样的事情(哪些不起作用)。
mydataframe <- data.frame(id = 1,
paste0('Here_','my_','column_','name') = 'foo')
# Error: unexpected '=' in:
# "mydataframe <- data.frame(id = 1,
# paste0('Here_','my_','column_','name') ="
另外,为什么不起作用?
答案 0 :(得分:4)
Data.frame
是一个函数,因此接受参数。这些参数不能是其他函数。例如,您无法定义fn <- function(paste0('Hi_', 'how_are_you') = x) { x }
之类的函数。 R就是这样不行。
但是,您仍然可以在事实之后动态更改列名:
df <- data.frame(1, 'foo')
names(df) <- c('id', paste0('Here_','my_','column_','name'))
那应该做你想要的。
额外奖励:您可以按照以下方式简化粘贴:paste('Here', 'my', 'column', 'name', sep = '_')
。
答案 1 :(得分:0)
你可以做到
df[, paste('Here', 'my', 'column', 'name', sep = '_')] <- 'foo'
不可能像你建议的那样去做,因为没有评估变量,它只是得到你正在编写的内容,并试图将它用作列的名称。这样,paste('Here', 'my', 'column', 'name', sep = '_')
得到了评估,返回的字符串实际上被用作列的名称。
答案 2 :(得分:0)
前段时间我需要同样的解决方法,将所有命令放在粘贴功能中,并进行以下评估
i=3
mydf <- eval(parse(text = paste0(
"data.frame( id =", 1, ", my_col", i, "=", 55, ")")))
答案 3 :(得分:0)
您可以使用setNames
来通过paste()定义data.frame
的列名-动态指定列名
setNames(data.frame(1, 'foo'), c("id", paste0('Here_','my_','column_','name')))
# id Here_my_column_name
#1 1 foo