这个问题类似于this,但它有一个C#答案,我需要一个R答案。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, 9L), 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
值行是一个“叶” OA树,分支在level
列1至4列中标识。我想通过brach总结叶子并将相应的值放在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, 9L), 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个关卡。
有没有更简单的方法来做到这一点?
这很有效,但如果你允许我,我想保持一段时间,以查看是否有人可以用不同的方法考虑解决方案。谢谢! – PavoDive
@PavoDive这是个好主意。这是一个奇怪的数据结构,因此看看人们肯定会想出什么会很有趣。 – jenesaisquoi
该数据结构属于财务报表报表。级别为账户:子账户:子子账户等。某些软件以打印格式导出报告,而不是分析。在你的帮助下,我能够分析它们,主要是通过“prop.table” – PavoDive