【问题标题】:Rename .id column in ldply重命名 ldply 中的 .id 列
【发布时间】:2013-03-11 06:54:51
【问题描述】:

有没有办法为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 列提供解决方案。

【问题讨论】:

  • 我不这么认为(但很高兴错了);也许您可以编写自己的包装函数来执行此操作?

标签: r plyr


【解决方案1】:

您似乎很乐意使用 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

【讨论】:

  • 是的,这个或其他一些包装器是我知道的唯一方法。这意味着 OP 试图将元名称分配给原始列表中的名称列表,这违反了“ldply”函数的逻辑。更容易(至少在眼睛上)是在之后简单地更改“.id”列名称,使用names(data_Frame)[1] <- "newname" 之类的行
【解决方案2】:

我有proposedimplementation,让我们看看它是否成为正式的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')

编辑:现在可以在 CRAN 上的 plyr 1.8.1 中使用:

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

【讨论】:

  • 我刚刚发现使用ldply.id 值是从输入“list”的names 中提取的。因此,如果列表是您稍后要在其上聚合的不同级别的数据列表(例如),请确保该列表具有名称,例如 names(mylist) <- seq_along(mylist)。如果输入列表的名称为 NULL,则不会显示由.id 参数命名的列。
  • 这条评论被低估了。想使用 ldply 函数将 csv 文件绑定在一起并将文件的名称保留为新列。将列表的名称设置为 names(mylist)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多