在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]。
发布于 2016-09-10 12:11:36
以下是我对解决方案的两种尝试:第一种使用data.table的汇总语法,使用行号.I和位置i处的条件计算逻辑向量,用于子集和更新列;第二种使用which和setdiff从条件中删除某些行号,另一方面,如果您需要行号和条件的and操作,可以用union替换setdiff
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 morehttps://stackoverflow.com/questions/39422316
复制相似问题