R -链接数据的最佳实践.表操作



到处搜索,但没有找到任何安排数据的通用准则。表链代码,可能跨越多行,以提高可读性。

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]]

最新更新