2015-04-20 35 views
0

我想如下重命名使用分配功能的时间序列列 -R:重命名列的时间序列数据

assign(colnames(paste0(<logic_to_get_dataset>)), 
c(<logic_to_get_column_names>)) 

我得到一个警告:In assign(colnames(get(paste0("xvars_", TopVars[j, 1], "_lag", : only the first element is used as variable name

也列名任务不会发生。我认为这是因为colnames()函数发生的。有没有解决方法?

+0

我从来没有使用'assign()'...在这种情况下是否有必要? –

+0

我使用for循环对25个数据集执行一组操作,这是操作之一。我只是assign()的工具,在这种情况下工作。我也乐于尝试其他方式。 – sumoka

+0

分配示例中的for循环是否有帮助(cran帮助页)?它循环执行粘贴并在之后进行分配。 –

回答

0

问题是,分配只看向量的第一个元素。

你可以试试这个,例如:

df = data.frame(x = 1:3, y = 4:2) 
within(df, assign(colnames(df),c('a','b')) 

你会注意到的是,R仅着眼于第一变量,它试图重新分配由这些列名描述第二个值的值。这种行为显然不是你想要的。

不幸的是,它是一种hackey的,但你总是可以使用类似这样

data.frame.name = get_df()#some function that returns text 
data.frame.columns = get_cols()#some function that returns text 
eval(parse(text = paste0('colnames(',data.frame.name,') = c(', 
paste(data.frame.columns,collapse = ','),')'))) 

我宁愿避免做这些类型的表达式,但预期它应该工作。

+0

谢谢。我尝试了第一个解决方案,但它出错了。 'UseMethod中的错误(“内部”): 没有适用于'内'的方法适用于类“c('mts','ts','matrix')的对象”' – sumoka

+0

对不起。第一部分不应该是一个解决方案。它基本上表明'assign()'在这种情况下不是一个有用的工具。我会创建表达式本身,然后解析和评估它(用'eval()'和'parse()')。可能有另一种方法来使用'assign()'来做到这一点,但我不知道。 –

+0

我看到:)。当然,谢谢! – sumoka

0

这里不言而喻 -

temp_var <- paste0('colnames(var_',TopLines[j,1],'_lag',get(paste0('uniqLg_',TopLines[j,1]))[k,],'_',get(paste0('uniqLg_',TopLines[j,1]))[k,]+12 , 
     ') <- c(gsub("xt',get(paste0('uniqLg_',TopLines[j,1]))[k,],'" , "xt',get(paste0('uniqLg_',TopLines[j,1]))[k,],'__',get(paste0('uniqLg_',TopLines[j,1]))[k,]+12, 
     '", colnames(var_',TopLines[j,1],'_xt',get(paste0('uniqLg_',TopLines[j,1]))[k,],')))') 

print(temp_var) 

eval(parse(text=temp_var)) 

其中背线与一列的数据帧和所包含的行的列表。这种方法唯一的问题是,我不能测试eval的输出,除非我真的打开数据集并查看这些更改是否受到影响。