2013-03-21 65 views
4

有没有办法将自定义名称分配给ldply的结果中通常名为.id的列?在ldply中重命名.id列

> ldply(setNames(1:3, 1:3), function(i) data.frame(j=1/i)) 
    .id   j 
1 1 1.0000000 
2 2 0.5000000 
3 3 0.3333333 

我知道我可以调用的结果rename,但我想这样做的一个电话。有什么建议么?

注意,从类似的问题adply遭罪:

> adply(as.array(setNames(1:3, 1:3)), 1, function(i) data.frame(j=1/i)) 
    X1   j 
1 1 1.0000000 
2 2 0.5000000 
3 3 0.3333333 

另一个related question地址重命名“数据”列的问题,但答案还没有提供针对.id列的解决方案。

+1

我不这么认为(但会很乐意是错误的);也许你可以编写自己的包装函数来做到这一点? – 2013-03-21 16:31:44

回答

3

你似乎很喜欢使用setNames,所以你可以将“j”和“newname”赋值移动到一个方便的包装上。

setNames(ldply(setNames(1:3, 1:3), function(i) data.frame(1/i)) , c("newname", "j")) 
    newname   j 
1  1 1.0000000 
2  2 0.5000000 
3  3 0.3333333 
+1

是的,这个或其他一些包装是我知道这样做的唯一方法。这意味着OP正尝试将一个元名称分配给原始列表中的名称列表,这违反了'ldply'函数的逻辑。甚至更容易(至少在眼睛上),只需要用'names(data_Frame)[1] < - “newname”' – Dinre 2013-03-21 16:53:34

4

我有proposed一个implementation,让我们来看看它使得它成为正式plyr。基本上,一个新的参数.idname,允许指定的.id列的名称,与一个选项,以通过使NULL完全放弃它:

> ldply(setNames(1:3, 1:3), function(i) data.frame(j=1/i), .idname='i') 
    i   j 
1 1 1.0000000 
2 2 0.5000000 
3 3 0.3333333 

。安装使用

library(devtools) 
install_github('plyr', 'krlmlr', ref='140-142-id') 

编辑微调的版本:这是现在在plyr 1.8.1可在CRAN:

> ldply(setNames(nm=1:3), function(i) data.frame(j=1/i), .id='i') 
+0

这样的一行来简单地改变“.id”列名,我只是用'ldply '','.id'值从输入“'list'”的'名称'中拉出来。因此,如果列表是您希望在其后聚合的不同级别的数据列表(例如),请确保该列表具有名称,例如'names(mylist)< - seq_along(mylist)'。如果输入列表的名称为NULL,则由'.id'参数命名的列将不会显示。 – Kalin 2015-04-04 01:17:24