【问题标题】:Set attribute to a list of data.tables from a list of names将属性设置为名称列表中的 data.tables 列表
【发布时间】:2020-03-14 20:46:46
【问题描述】:

我正在尝试为来自名称列表的列表中的每个data.table 设置一个属性,如下所示:

DT = data.table(
  ID = c("b","b","b","a","a","c"),
  a = 1:6,
  b = 7:12,
  c = 13:18
)
DT <- list(DT, DT, DT)
names <- c("NAME1", "NAME2", "NAME3")
sapply(DT, function(x) setattr(x, "name", names))
attr(DT[[1]], "name")
# [1] "NAME1" "NAME2" "NAME3"
sapply(DT, function(x, y) setattr(x, "name", y), names)
attr(DT[[1]], "name")
# [1] "NAME1" "NAME2" "NAME3"

但是可以看出,分配给列表中每个data.table的是整个名称列表。

是否有 FP 方法来实现这一点?我怎么能做类似于 scala 中的事情:

zip(DT, names)

然后对每一对进行操作?我试过这个,没有运气:

sapply(list(DT, names), function(x) setattr(x[[1]], "name", x[[2]]))

另外,我觉得sapply 不是在这里使用的正确函数。

预期输出

attr(DT[[1]], "name") # NAME1
attr(DT[[2]], "name") # NAME2
attr(DT[[3]], "name") # NAME3

【问题讨论】:

  • 预期输出是什么?
  • 您只是想为您的列表指定名称?
  • @RonakShah,对于列表的每个元素,似乎我把它复杂化了。

标签: r scala functional-programming data.table


【解决方案1】:

您可以使用以下方法轻松设置数据表列表的所有名称:

DT <- setNames(DT, names)

请注意,您需要将其重新签名为 DT 以保留 DT 中的更改。

【讨论】:

  • @A.Suliman 是的,DT &lt;- setNames(DT, names),那么对于每个DT,我都有它的名字:names(DT[1]) -&gt; NAME1, names(DT[2]) -&gt; NAME2,, names(DT[3]) -&gt; NAME3
  • 显然。您在具体的 data.table 上选择名称,而不是在列表上。尝试 names(DT) 获取列表中所有 data.tables 的名称列表。
【解决方案2】:

理想情况下,您正在寻找的函数是Map,这样的东西应该可以工作

Map(function(x, y) setattr(x, "name", y), DT, names)

但我认为你不能为同一个对象拥有同名的属性。例如看这个,

setattr(DT[[1]], "name", names[1])
attr(DT[[1]], "name")
#[1] "NAME1"

现在这个

setattr(DT[[2]], "name", names[2])
attr(DT[[2]], "name")
#[1] "NAME2"
attr(DT[[1]], "name")
#[1] "NAME2"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-14
    • 1970-01-01
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 2011-09-29
    • 1970-01-01
    相关资源
    最近更新 更多