gpt4 book ai didi

r - 如何在R data.table中有效地找到具有非零值的最后一行

转载 作者:行者123 更新时间:2023-12-04 10:50:09 26 4
gpt4 key购买 nike

简介

我试图找到如何在给定列中找到具有非零值的最后一行并返回该行上不同列的值的最佳方法。我想在 R data.table 中执行此操作,并且正在寻找该操作的最大效率。

示例

让我们有一个像这样的数据表:

set.seed(123)
DT = data.table(x=rep(c("b","a","c"),each=6),
y=rep(1:6, 3),
z = rbinom(18, 1, 0.3))

这为我们提供了以下数据表:
    x y z
1: b 1 0
2: b 2 1
3: b 3 0
4: b 4 1
5: b 5 1
6: b 6 0
7: a 1 0
8: a 2 1
9: a 3 0
10: a 4 0
11: a 5 1
12: a 6 0
13: c 1 0
14: c 2 0
15: c 3 0
16: c 4 1
17: c 5 0
18: c 6 0

现在,该表用于按列 y 排序的列 x 中的每个值。对于由列 x 中的值给出的每个组,我想创建一个列,它会给我每一行的值 y从最后一个非零值 z 的行开始.

现在我对每个 y 使用 lapply 并按 x 分组,这给出了所需的结果:
DT[, list(y,
z,
output = lapply(y, function(x) max(y[z != 0 & y <= x]))
),
by = 'x']

问题

我可以使示例中的代码更有效吗?

最佳答案

您可以尝试使用 nafill :

# create a dummy column that is only populated for nonzero z (and hence NA elsewhere)
DT[z != 0, y_copy := y]
# nafill on this column using LOCF strategy by group:
DT[ , ans := nafill(y_copy, type = 'locf'), by = x][]
# x y z y_copy ans
# 1: b 1 0 NA NA
# 2: b 2 1 2 2
# 3: b 3 0 NA 2
# 4: b 4 1 4 4
# 5: b 5 1 5 5
# 6: b 6 0 NA 5
# 7: a 1 0 NA NA
# 8: a 2 1 2 2
# 9: a 3 0 NA 2
# 10: a 4 0 NA 2
# 11: a 5 1 5 5
# 12: a 6 0 NA 5
# 13: c 1 0 NA NA
# 14: c 2 0 NA NA
# 15: c 3 0 NA NA
# 16: c 4 1 4 4
# 17: c 5 0 NA 4
# 18: c 6 0 NA 4

目前, nafill是一个仅限开发的功能 ( data.table 1.12.3+) 但 1.12.4 应该会在接下来的一两周内在 CRAN 上发布。目前,您可以使用 install.packages('data.table', type = 'source', repos = 'http://Rdatatable.github.io/data.table') 安装它

如果您不想创建 y_copy ,您可以使用 is.na<- 内联执行此操作:
DT[ , ans := nafill(`is.na<-`(y, z == 0), type = 'locf'), by = x]

这将是低效的,因为 z==0按组重复计算(而不是作为单个向量);您可以在第一步中执行此操作:
DT[ , z_zero := z == 0]

但这意味着另一个虚拟列(如果 y_copyynumericcharacter ,则存储空间少于 complex )

关于r - 如何在R data.table中有效地找到具有非零值的最后一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58041577/

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