【发布时间】:2015-08-09 00:41:53
【问题描述】:
这个问题类似于this,但它有一个 C# 答案,我需要一个 R 答案。
我有大约 650 行的大约 50 个文件,其格式和数据与这个玩具数据非常相似:
dput(y)
structure(list(level1 = c(4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L,
4L, 4L, 4L), level2 = c(NA, 41L, 41L, 41L, 41L, 41L, 41L, 41L,
42L, 42L, 42L, 42L), level3 = c(NA, NA, 4120L, 4120L, 4120L,
4120L, 4120L, 4120L, NA, 4210L, 4210L, 4210L), level4 = c(NA,
NA, NA, 412030L, 412030L, 412050L, 412050L, 412050L, NA, NA,
421005L, 421005L), pid = c(NA, NA, NA, NA, 123456L, NA, 789012L,
345678L, NA, NA, NA, 901234L), description = c("income", "op.income",
"manuf.industries", "manuf 1", "client 1", "manuf 2", "client 2",
"client 3", "non-op.income", "financial", "interest", "bank 1"
), value = c(NA, NA, NA, NA, 15000L, NA, 272860L, 1150000L, NA,
NA, NA, 378L)), .Names = c("level1", "level2", "level3", "level4",
"pid", "description", "value"), class = c("data.table", "data.frame"
), row.names = c(NA, -12L), .internal.selfref = <pointer: 0x00000000001a0788>)
在value 上具有值的每一行都是树的“叶子”,在列level1 到 4 中标识了分支。我想按分支汇总叶子并将相应的值放入value 专栏。
我的预期输出如下所示:
dput(res)
structure(list(level1 = c(4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L,
4L, 4L, 4L), level2 = c(NA, 41L, 41L, 41L, 41L, 41L, 41L, 41L,
42L, 42L, 42L, 42L), level3 = c(NA, NA, 4120L, 4120L, 4120L,
4120L, 4120L, 4120L, NA, 4210L, 4210L, 4210L), level4 = c(NA,
NA, NA, 412030L, 412030L, 412050L, 412050L, 412050L, NA, NA,
421005L, 421005L), pid = c(NA, NA, NA, NA, 123456L, NA, 789012L,
345678L, NA, NA, NA, 901234L), description = c("income", "op.income",
"manuf.industries", "manuf 1", "client 1", "manuf 2", "client 2",
"client 3", "non-op.income", "financial", "interest", "bank 1"
), value = c(1438238L, 1437860L, 1437860L, 15000L, 15000L, 1422860L,
272860L, 1150000L, 378L, 378L, 378L, 378L)), .Names = c("level1",
"level2", "level3", "level4", "pid", "description", "value"), class = c("data.table",
"data.frame"), row.names = c(NA, -12L), .internal.selfref = <pointer: 0x00000000001a0788>)
我知道这可以通过 for 循环来完成,但我想知道是否有更快、更简单的替代方案(我更喜欢 data.table 或基本解决方案,但任何其他包也可以)。到目前为止我尝试过的:
z4<-y[!is.na(pid),sum(value),by=level4]
setkey(y,"level4");setkey(z4,"level4")
y[z4,][is.na(pid)]
这显示了V1 中的所需值,所以我想看看是否可以将它们分配给value:
y[z4,][is.na(pid),value:=i.V1]
Error in eval(expr, envir, enclos) : object 'i.V1' not found
我认为这可能是因为调用 i.V1 在链式 [ 中,而不是在初始 y[z4 调用中。但是,如果我只在z4 上设置子集,我怎么知道我应该分配几个匹配的level4 行中的哪一个(这就是我考虑使用is.na(pid) 的原因,因为y[z4,value:=i.V1] 会产生错误的结果,因为它更新所有匹配 level4) 的值。
如您所见,我严重卡在了这个问题上,并且使用“我的方法”我还有 3 个关卡要做。
有没有更简单的方法来做到这一点?
【问题讨论】:
标签: r tree data.table aggregate