gpt4 book ai didi

R - 链接 data.table 操作的最佳实践

转载 作者:行者123 更新时间:2023-12-03 21:43:05 26 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Break data.table chain into two lines of code for readability

(3 个回答)



data.table alternative to piping

(1 个回答)


去年关闭。




到处搜索,但没有找到任何用于安排可能跨越多行以提高可读性的 data.table 链式代码的一般准则。
以 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"]

但是以 f.ex.像这样。你会怎么清理 此代码片段 你会在哪里缩进/换行?注意:这只是一个长 data.table 链式代码块在实践中的样子的玩具示例。
    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]]

关于R - 链接 data.table 操作的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66190106/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com