到处搜索,但没有找到任何安排数据的通用准则。表链代码,可能跨越多行,以提高可读性。
f.ex。(只是为了说明目的的玩具例子)
iris.dt[sepal.length > 5 & sepal.width > 3 & petal.length > 2 & petal.width > 2 & species == "virginica"]
由于这些都对应于相同的参数(dt[i]),将其分成多行很容易,我只需这样做:
iris.dt[sepal.length > 5 &
sepal.width > 3 &
petal.length > 2 &
petal.width > 2 &
species == "virginica"]
或
iris.dt[sepal.length > 5 &
sepal.width > 3 &
petal.length > 2 &
petal.width > 2 &
species == "virginica"]
但以fob为例。像这样的。如何清理这个代码片段在哪里缩进/换行?注意:这只是一个玩具的例子,什么是长数据。表链代码块在实践中可能是这样的。
iris.dt[, id := 1:.N, by = species][, comb_area_sepal := (sepal.length * sepal.width),
by = species][, comb_area_petal := (petal.length * petal.width), by = species][
species == "virginica" & comb_area_petal > 12.5, .(petal.width, petal.length, comb_area_petal]
我该如何处理这样的代码?如何最好地断行并安排参数和括号?我应该优先考虑提高可读性
?有时候,特别是在处理大型数据集和变量名(列名)非常长以描述某种类型时,参数(主要是j)将跨越几行。如果它们跨越多行(dt[I, j, by]),我应该缩进相同的参数吗?所以从第二行开始缩进j ?
我的直觉会像这样打破上面的玩具示例:
iris.dt[, id := 1:.N, by = species][,
comb_area_sepal := (sepal.length * sepal.width),
by = species][,
comb_area_petal := (petal.length * petal.width),
by = species][
species == "virginica" & comb_area_petal > 12.5,
.(petal.width, petal.length, comb_area_petal]
你觉得怎么样?我意识到这在不同的编码风格之间也可能有所不同,但是我非常感兴趣的是,您在实践中应用了哪些概念来保持这些代码易于阅读。
创建序列的第一个操作可以用rowid
简化,然后通过乘法创建两列的第二个和第三个操作实际上不需要group by,因为这些是元素操作,可以组合在一起。最后一个是子集(行),选择列
iris.dt[, id := rowid(species)][,
c('comb_area_sepal', 'comb_area_petal') :=
.((sepal.length * sepal.width), (petal.length * petal.width))
][species == "virginica" & comb_area_petal > 12.5,
.(petal.width, petal.length, comb_area_petal)]
也可以与%>%
链接
library(magrittr)
iris.dt[, id := rowid(species)] %>%
.[,c('comb_area_sepal', 'comb_area_petal') :=
.((sepal.length * sepal.width), (petal.length * petal.width))
] %>%
.[species == "virginica" & comb_area_petal > 12.5,
.(petal.width, petal.length, comb_area_petal)]
与产出
# petal.width petal.length comb_area_petal
# 1: 2.5 6.0 15.00
# 2: 2.2 5.8 12.76
# 3: 2.1 6.6 13.86
# 4: 2.5 6.1 15.25
# 5: 2.2 6.7 14.74
# 6: 2.3 6.9 15.87
# 7: 2.3 5.7 13.11
# 8: 2.0 6.7 13.40
# 9: 2.0 6.4 12.80
#10: 2.3 6.1 14.03
#11: 2.4 5.6 13.44
#12: 2.4 5.6 13.44
#13: 2.3 5.9 13.57
#14: 2.5 5.7 14.25
对于第一种情况,也可以简化为
iris.dt[iris.dt[, Reduce(`&`, Map(`>`,.SD, .(5, 3, 2, 2))) &
species == 'virginica', .SDcols = sepal.length:petal.width]]