2010-04-28 57 views
3

我有一个在它与列名叫做cols列表:从列表中data.frame命令中指定的列名

cols <- c('Column1','Column2','Column3')

我想重现这一命令,但调用名单:

data.frame(Column1=rnorm(10))

这里发生了什么,当我尝试:

如果我在I()eval()包裹

Error: unexpected '=' in "data.frame(I(cols[1])="

同样的事情发生。

我该如何将该物品从矢量中送入data.frame()命令?

更新:

对于一些背景下,我已经定义了一个函数calc.means()采用一个数据帧和的变量的列表,并且执行大而复杂ddply操作中,在由变量指定的级别总结。

我试图用data.frame()命令做的是走备份聚集级别的极顶,重新运行在每一步calc.means()使用rbind()粘上结果到彼此。我需要添加具有“全部”值的虚拟列,以便让绑定正常工作。

我将cast类似于margin函数转换为ddply,基本上,我不想为每次运行重新输入列名称。下面是完整的代码:

cols <- c('Col1','Col2','Col3') 
rbind (calc.means(dat,cols), 
    data.frame(cols[1]='All', calc.means(dat, cols[2:3])), 
    data.frame(cols[1]='All', cols[2]='All', calc.means(dat, cols[3])) 
) 

回答

1

我不知道如何直接做到这一点,但你可以直接跳过在data.frame()命令分配名称的步骤。假设你存储data.frame()在一个变量名为foo的结果,你可以简单地做:

名(富)< - 创建数据帧的cols

+0

是的,这将正常工作,但'data.frame()'发生的'rbind内()'。谢谢,不过。 – 2010-04-28 16:41:32

+1

您可以创建数据框,分配列名,然后将它们全部在一个子句中。 – Shane 2010-04-28 17:57:14

+0

Shane, 这将如何工作?我不确定如何通过单个子句中的过程传递对象。 – 2010-04-29 13:46:42

2

使用可以使用structure

cols <- c("a","b") 

foo <- structure(list(c(1, 2), c(3, 3)), .Names = cols, row.names = c(NA, -2L), class = "data.frame") 

我不明白为什么要执行该操作!

1

有一招。你可以用列表的混乱:

cols_dummy <- setNames(rep(list("All"), 3), cols) 

这时如果使用电话与一个括号列出,那么你应该得到你想要

data.frame(cols_dummy[1], calc.means(dat, cols[2:3])) 

你可以使用它在即时为setNames(list("All"), cols[1])什么但我认为它不太优雅。

例子:

some_names <- list(name_A="Dummy 1", name_B="Dummy 2") # equivalent of cols_dummy from above 
data.frame(var1=rnorm(3), some_names[1]) 
#  var1 name_A 
# 1 -1.940169 Dummy 1 
# 2 -0.787107 Dummy 1 
# 3 -0.235160 Dummy 1 
0

相信分配()函数是你的答案:

cols <- c('Col1','Col2','Col3') 
data.frame(assign(cols[1], rnorm(10))) 

返回:

assign.cols.1...rnorm.10.. 
1     -0.02056822 
2     -0.03675639 
3     1.06249599 
4     0.41763399 
5     0.38873118 
6     1.01779018 
7     1.01379963 
8     1.86119518 
9     0.35760039 
10     1.14742560 

随着lapply()或sapply()函数,你应该能够循环cbind()过程。喜欢的东西:

operation <- sapply(cols, function(x) data.frame(assign(x, rnorm(10)))) 
final  <- data.frame(lapply(operation, cbind)) 

返回:

Col1.assign.x..rnorm.10.. Col2.assign.x..rnorm.10.. Col3.assign.x..rnorm.10.. 
1    0.001962187    -0.3561499    -0.22783816 
2    -0.706804781    -0.4452781    -1.09950505 
3    -0.604417525    -0.8425018    -0.73287079 
4    -1.287038060     0.2545236    -1.18795684 
5    0.232084366    -1.0831463    0.40799046 
6    -0.148594144     0.4963714    -1.34938144 
7    0.442054119     0.2856748    0.05933736 
8    0.984615916    -0.0795147    -1.91165189 
9    1.222310749    -0.1743313    0.18256877 
10    -0.231885977    -0.2273724    -0.43247570 

然后,清理列名:

colnames(final) <- cols 

返回:

  Col1  Col2  Col3 
1 0.19473248 0.2864232 0.93115072 
2 -1.08473526 -1.5653469 0.09967827 
3 -1.90968422 -0.9678024 -1.02167873 
4 -1.11962371 0.4549290 0.76692067 
5 -2.13776949 3.0360777 -1.48515698 
6 0.64240694 1.3441656 0.47676056 
7 -0.53590163 1.2696336 -1.19845723 
8 0.09158526 -1.0966833 0.91856639 
9 -0.05018762 1.0472368 0.15475583 
10 0.27152070 -0.2148181 -1.00551111 

干杯,

亚当