【问题标题】:R: How to change item (or object) names of a data.table list?R:如何更改 data.table 列表的项目(或对象)名称?
【发布时间】:2015-10-11 18:48:58
【问题描述】:

我需要对我的数据进行“拆分”,以保留我之前的订单,为此我使用了here 提供的 data.table 解决方案。我根据两列“拆分”我的数据。请参阅下面的示例:

df = data.frame(product = c("b", "a", "b", "a"),
                value = c(sample(1:10,4)),
                year = c(2001, 2001, 2000, 2000))

require(data.table)
dt <- data.table(df)
dt[, grp := .GRP, by = list(product,year)] 
setkey(dt, grp)
o2 <- dt[, list(list(.SD)), by = grp]$V1

此代码返回列表,而不按字母或数字重新排序。但是,我想将项目名称更改为产品和年份的组合。

> o2
[[1]]
   product value year
1:       b     3 2001

[[2]]
   product value year
1:       a     8 2001

[[3]]
   product value year
1:       b     4 2000

[[4]]
   product value year
1:       a     7 2000

预期的结果应该是这样的:

> o2
$b.2001
   product value year
1:       b     3 2001

$a.2001
   product value year
1:       a     8 2001

$b.2000
   product value year
1:       b     4 2000

$a.2000
   product value year
1:       a     7 2000

另一种拆分技术也可以,但我需要保持我之前的顺序。感谢您的想法

【问题讨论】:

    标签: r split data.table


    【解决方案1】:

    这是我目前的处理方式。

    require(data.table)
    tmp = setDT(df)[, list(grp=list(.SD)), by=.(product, year), .SDcols=names(df)]
    setattr(ans <- tmp$grp, 'names', paste(tmp$product, tmp$year, sep="."))
    ans
    # $b.2001
    #    product value year
    # 1:       b     7 2001
    # 
    # $a.2001
    #    product value year
    # 1:       a     3 2001
    # 
    # $b.2000
    #    product value year
    # 1:       b    10 2000
    # 
    # $a.2000
    #    product value year
    # 1:       a     9 2000
    

    我添加了一个FR #1389 来提供一个split.data.table 方法,使用它应该可以一步完成。

    但在大多数情况下,处理一个data.frame/data.table 比处理一个列表更容易。因此,更深入地了解您的下游任务可能有助于确定这是否真的有必要..

    【讨论】:

    • 感谢您的回答。我有一个大型贸易数据集,必须拆分为 94 个产品和 17 年并链接到另一个数据集。因此,我每年需要相同的订单才能正确链接数据集(名称对于检查很重要,因为我在两者之间进行了一些计算)。
    【解决方案2】:

    最近对 data.table 的提交提供了split 方法。它建立在 Arun 的答案之上,并提供了一些额外的灵活性参数,请阅读 ?split data.table 方法了解详细信息。

    split(setDT(df), by=c("product","year"))
    #$b.2001
    #   product value year
    #1:       b     4 2001
    #
    #$a.2001
    #   product value year
    #1:       a     5 2001
    #
    #$b.2000
    #   product value year
    #1:       b     6 2000
    #
    #$a.2000
    #   product value year
    #1:       a     7 2000
    

    安装当前开发的data.table可以通过

    install.packages("data.table",
                     repos="https://Rdatatable.github.io/data.table",
                     type="source")
    

    另外两个提供的解决方案,一个由 OP 和 Arun 提供,也是有效的,也将得到支持,添加了单元测试以确保这一点。如果您编写新代码,您绝对应该使用 split 方法来提高可读性。

    【讨论】:

      猜你喜欢
      • 2020-01-19
      • 1970-01-01
      • 2011-06-24
      • 1970-01-01
      • 1970-01-01
      • 2015-05-28
      • 1970-01-01
      • 2019-02-16
      相关资源
      最近更新 更多