我无法理解这段代码在做什么。谁能解释一下吗? excelTbl[,(总和(`本期金额'), 总和(`比较期金额'), 总和(`%Change`), type=if(sum(`Current Period Amount`)-sum(`Comparison Period Amount`)=variancePer)& #(绝对值(V3)*100>=方差接受器)& (绝对值(V2-V1)>=varianceAmt*1000000) }否则{ ((绝对值(V2-V1)*100/绝对值(V2))>=variancePer)| #(绝对值(V3)*100>=方差接受器)| (绝对值(V2-V1)>=varianceAmt*1000000) }), 1:2]
我无法理解这段代码在做什么。谁能解释一下吗? excelTbl[,(总和(`本期金额'), 总和(`比较期金额'), 总和(`%Change`), type=if(sum(`Current Period Amount`)-sum(`Comparison Period Amount`)=variancePer)& #(绝对值(V3)*100>=方差接受器)& (绝对值(V2-V1)>=varianceAmt*1000000) }否则{ ((绝对值(V2-V1)*100/绝对值(V2))>=variancePer)| #(绝对值(V3)*100>=方差接受器)| (绝对值(V2-V1)>=varianceAmt*1000000) }), 1:2],r,data.table,R,Data.table,round(V1)!=0返回一个逻辑向量,只要表中有行。比如说, 1:5
round(V1)!=0
返回一个逻辑
向量,只要表中有行。比如说,
1:5<3
#[1]正确-正确-错误-错误
…&圆形(V2)!=0
是一个矢量化的“AND”,只要表中有行,它就仍然存在。比如说,
(1:5<3)和(6:10<7)
#[1]对错错错错
if(logicalOp==1)。。。否则…
将根据logicalOp
的值计算两个逻辑
向量中的一个。如果它是1,那么它在逻辑上是“AND”,是从
((abs(V2-V1)*100/abs(V2))>=variancePer)&
(绝对值(V2-V1)>=varianceAmt*1000000)
否则,另一个向量
这是与两个round
逻辑向量的结果“和”相关的向量
因为所有这些都在第一个逗号之前(在括号索引的i=
组件中),所以它定义了要返回的行。如果只要有行,就有一个逻辑向量,那么TRUE
的行将被保留,FALSE
将被丢弃
当data.table
中的许多内容就地运行时(引用语义,与R的常规写时复制语义相反),任何像这样对行进行子集的操作都将返回另一个data.table
对象,而不会就地修改原始对象。因此,应该将此代码块的值捕获到一个新变量中1:2
选择前两列
有趣的是,第一个括号块创建了一个包含六列的data.table
,分别命名为Class
和AccountSubType
(使用by=
定义的组)、V1
、V2
、V3
和type
。但是,第二个括号块在筛选中仅引用V1
和V2
,然后丢弃除Class
和AccountSubType
之外的所有内容,因此。。。看来没有必要计算round(V1)!=0
返回一个逻辑
向量,只要表中有行。比如说,
1:5<3
#[1]正确-正确-错误-错误
…&圆形(V2)!=0
是一个矢量化的“AND”,只要表中有行,它就仍然存在。比如说,
(1:5<3)和(6:10<7)
#[1]对错错错错
if(logicalOp==1)。。。否则…
将根据logicalOp
的值计算两个逻辑
向量中的一个。如果它是1,那么它在逻辑上是“AND”,是从
((abs(V2-V1)*100/abs(V2))>=variancePer)&
(绝对值(V2-V1)>=varianceAmt*1000000)
否则,另一个向量
这是与两个round
逻辑向量的结果“和”相关的向量
因为所有这些都在第一个逗号之前(在括号索引的i=
组件中),所以它定义了要返回的行。如果只要有行,就有一个逻辑向量,那么TRUE
的行将被保留,FALSE
将被丢弃
当data.table
中的许多内容就地运行时(引用语义,与R的常规写时复制语义相反),任何像这样对行进行子集的操作都将返回另一个data.table
对象,而不会就地修改原始对象。因此,应该将此代码块的值捕获到一个新变量中1:2
选择前两列
有趣的是,第一个括号块创建了一个包含六列的data.table
,分别命名为Class
和AccountSubType
(使用by=
定义的组)、V1
、V2
、V3
和type
。但是,第二个括号块在筛选中仅引用V1
和V2
,然后丢弃除Class
和AccountSubType
之外的所有内容,因此。。。看来没有必要计算,如果您可以更好地格式化代码(我已经为基本布局编辑了)。您不清楚这其中的哪部分?它是
(某物)
的基本数据表
语法吗?by=.(…)
?您是否用括号将其拆分以查看每个步骤都在做什么?例如,只需运行excelTbl[,(sum…,by=(Class,AccountSubType)]
,将其存储在临时变量中,然后尝试下一批?@r2evans我无法理解第二对方括号在做什么。基本上,"by"之后的部分,
excelTbl[, .(sum(`Current Period Amount`),
sum(`Comparison Period Amount`),
sum(`% Change`),
type = if (sum(`Current Period Amount`) - sum(`Comparison Period Amount`)< 0) "N" else "P"),
by = .(Class, AccountSubType)][round(V1) != 0 &
round(V2) != 0 &
(if (logicalOp == 1) {
((abs(V2 - V1) * 100 / abs(V2)) >= variancePer) &
#(abs(V3)*100 >= variancePer) &
(abs(V2 - V1) >= varianceAmt * 1000000)
} else {
((abs(V2 - V1) * 100 / abs(V2)) >= variancePer) |
#(abs(V3)*100 >= variancePer) |
(abs(V2 - V1) >= varianceAmt * 1000000)
}), 1:2]