gpt4 book ai didi

r - 将一个 data.table 有条件地划分为子表到列值

转载 作者:行者123 更新时间:2023-12-04 05:02:03 26 4
gpt4 key购买 nike

这个问题与data.table有关类,来自同音R包。

给定一个 data.table object 我想根据它的一些列的值将它分成切片。

为了说明我必须做什么,我举了一个例子。

假设这是输入 data.table .

dataf <- data.frame(list(
T = c(1.80,1.81,1.82,1.83,1.85,1.87,1.90,1.95,2.00),
A = c(1,0,1,1,1,0,1,1,0),
B = c(0,0,0,0,0,0,1,0,0),
C = c(0,1,0,1,1,0,1,1,0),
D = c(0,0,1,1,1,0,0,1,0))
)
datat <- data.table(dataf)
datat
# T A B C D
# 1: 1.80 1 0 0 0
# 2: 1.81 0 0 1 0
# 3: 1.82 1 0 0 1
# 4: 1.83 1 0 1 1
# 5: 1.85 1 0 1 1
# 6: 1.87 0 0 0 0
# 7: 1.90 1 1 1 0
# 8: 1.95 1 0 1 1
# 9: 2.00 0 0 0 0

目标 就是把这个表拆分成子表,根据 n的值选定的列(使用 n = 0, ..., ncol(datat) - 1 )。

对于此输入,选择作为 anchor 列 CD ,输出必须是这样的:
# $`0|0`
# T A B C D
# 1: 1.80 1 0 0 0

# $`1|0`
# T A B C D
# 1: 1.81 0 0 1 0

# $`0|1`
# T A B C D
# 1: 1.82 1 0 0 1

# $`1|1`
# T A B C D
# 1: 1.83 1 0 1 1
# 2: 1.85 1 0 1 1

# $`0|0`
# T A B C D
# 1: 1.87 0 0 0 0

# $`1|0`
# T A B C D
# 1: 1.90 1 1 1 0

# $`1|1`
# T A B C D
# 1: 1.95 1 0 1 1

# $`0|0`
# T A B C D
# 1: 2.00 0 0 0 0

从刚刚显示的示例中可以推导出, split 条件是:
  • 所选列的值与上一行的值不同?

  • 重要提示:在此示例中,“值”一词必须用作一对列值。

    注意:

    我认为这个输出结构当时(第二个 目标 )我必须对这个子表应用一个(或两个)函数,获取它们的输出并聚合它们(例如求和、合并或其他操作)通过元素列表的通用名称(即 0|00|01|01|0 等等)。

    如果您认为有一个更合适或更简单的输出结构也可以实现第二个目标,那么您的建议非常受欢迎。

    显然,解决方案的性能很重要,因为我必须处理大表。

    不幸的是,我认为自己是 data.table 的新手。包,事实上我只知道一些关于它的事情:如何按列名等进行子集等等。

    所以非常感谢您的帮助,因为它将帮助我学习新的东西。提前致谢。

    最佳答案

    我会用 rle 来做和 split如下:

    ids <- do.call(paste, c(datat[, 4:5], sep="|"))
    rle.ids <- rle(ids)
    datat.spl <- split(datat, rep(seq_along(rle.ids$values), rle.ids$lengths))
    names(datat.spl) <- rle.ids$values

    阅读您的笔记部分,由于您的目标是通过对这些子表进行分组/聚合来将它们应用到这些子表中,因此我建议只在 data.table 中添加一列。像这样:
    datat[, grp1 := do.call(paste, c(datat[, 4:5], sep="|"))]

    如果需要,您还可以添加另一个分组,如下所示:
    datat[, grp2 := rep(seq_along(rle.ids$values), rle.ids$lengths)]

    现在,如果您希望将所有“0|0”组合在一起,则按 grp1 进行子集化.
    # example
    datat[, list(s.A = sum(A)), by = grp1]

    如果您希望对每个单独的“0|0”集进行聚合,则按 grp2 设置子集.
    # example
    datat[, list(grp1 = grp1[1], s.A = sum(A)), by = grp2]

    希望这会有所帮助。

    关于r - 将一个 data.table 有条件地划分为子表到列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16036406/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com