gpt4 book ai didi

r - 根据行号和条件选择 data.table R 行

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

在 data.table 中,我们可以根据行号或条件选择行:

> x <- data.table(letters[1:4], 1:4)
> x
V1 V2
1: a 1
2: b 2
3: c 3
4: d 4
> x[2]
V1 V2
1: b 2
> x[V1 == "d"]
V1 V2
1: d 4

但是我不能同时选择行号和条件:
> x[!2 & V2 > 1]
Empty data.table (0 rows) of 2 cols: V1,V2

这可能是因为 !2不被解释为这种格式的行号。我知道我可以链接两个条件:
> x[!2][V2 > 1]
V1 V2
1: c 3
2: d 4

但是我想为这个子集分配新的列值
x[!2][V2 > 1, V3 := "more"]

现在它只为中间链接的 data.table 创建列。我可以保存中间表然后合并回原始表,但这会很麻烦。

其实我经常觉得 data.table需要一个合适的行号。 .I是一个依赖于组的动态数字,但我想要一个可以标识每一行的唯一 ID,这个唯一 ID 在合并/加入中非常有用(通常数据没有唯一 ID)。如 .i是行号,我可以使用
x[(.i != 2) & (V2 >1), V3 := "more"]

我可以通过首先显式创建行号列来模拟这一点。

另一种方法是将子集 data.table 上的修改应用回原始表。假设我们有 x 作为原始表,x[!2] 作为一个子集,那么如果对 x[!2] 进行修改实际上修改x,我的问题也将得到解决。当然这种子集需要以不同的方式创建,例如 x[!2, refOriginal = TRUE] .

最佳答案

这是我对解决方案的两次尝试:第一个使用 data.table 的汇总语法使用行号计算逻辑向量 .I和位置条件 i用于子集化和更新列;第二个使用 whichsetdiff从条件中删除某些行号,如果另一方面您需要 and行号和条件的操作,setdiff可以换成union :

x[x[, .I != 2 & V2 > 2], V3 := "more"]
x
# V1 V2 V3
# 1: a 1 NA
# 2: b 2 NA
# 3: c 3 more
# 4: d 4 more


x[setdiff(which(V2 > 2), c(2)), V3 := "more"]
x
# V1 V2 V3
# 1: a 1 NA
# 2: b 2 NA
# 3: c 3 more
# 4: d 4 more

关于r - 根据行号和条件选择 data.table R 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39422316/

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