【问题标题】:building new data.table from the old one从旧数据表构建新数据表
【发布时间】:2014-04-09 09:13:16
【问题描述】:

我有一个包含k,v: (k1, v1), (k2, v2), (k3, v3)...列的数据表DT

我想通过键对值进行分组,然后对它们进行处理并生成一个新的数据表(或框架)(s1, t1), (s2, t2)...

每个分组的(k, v1, ..vi) 集合可以映射到目标data.table dest 中的0 或更多行,它们具有完全不同的键范围,与k 无关。

我知道我可以写:DT[, myfun(k,v), by=k],但我不确定这对我有什么帮助。

例如,假设我的函数myfun 需要计算s = prod(v1, ...vi) 然后 将行s 增加k: dest[s] += k

我不确定如何在 R 中编写代码!

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    您创建了 DT 的摘要版本:

    DT1 <- DT[, prod(v), by=k]
    

    然后使用 this 的值增加dest,$v 现在等于您帖子中的 s,因此标识要增加的行:

    dest[DT1$v, "columnToBeIncreased"] = dest[DT1$v, "columnToBeIncreased"] +DT1$k
    

    您说 dest 是一个 data.table,并且您想将一行增加给定的数量。如果您希望增加整行(即该行中的所有列),请省略“columnToBeIncreased”(甚至删除引号,但保留前面的逗号) - 否则将其设置为您想要的列的名称递增。

    【讨论】:

    • 这几乎就是我所需要的。如果我的函数需要发出几行怎么办。说(prod(v), k), (prod(v)+1, k^2)。可以在data.table中做吗?
    • 如果你想改变几行,那么只需添加另一行dest[DT1$v+1,] =dest[DT1$v+1,] + (DT1$k)^2。如果 emit 你的意思是你不是在增加 dest in situ 而是生成一个新的修改子集,那么你可以做newDT = rbind(LHS1, LHS2),其中 LHS 是左侧答案和此评论中的dest=dest+DT
    • 不,我的意思是发出类似这样的相位:DT = data.table(A=rep(1:5,5),B=21:45) res = rep(0, 50) DT[, { res[B] = res[B] + 1; res[B+1] = res[B+1] + 2;} , by=A] 花括号中的代码由于某种原因不会更改 res。
    • 所以我认为我之前的评论涵盖了这一点 - 使用我的代码的第一行在 k 组中生成 v 的相关摘要 - 你甚至可以执行 DT[,list(p=prod(v), s=sum(v)), by=k] 然后针对每组更改为了满足您的需要,请单独分配res[DT$p] &lt;- res[DT$p] + DT[k]。如果不是这样,请提供一个完整的示例,包括您期望作为最终输出的值。
    • 如果你真的想从DT分组操作中分配外部变量,你可以用&lt;&lt;-替换=,例如你有{res[prod(B)] &lt;&lt;- res[prod(B)] + 1。我不确定在存在分组因子的情况下保证将B 的非标量版本放入其中会做什么,因此要么删除by,要么添加有保证的标量函数(例如prod 或sum 或mean) 围绕 B 的实例
    猜你喜欢
    • 2017-02-03
    • 2022-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多