【发布时间】:2020-04-08 23:41:55
【问题描述】:
我想使用data.table 创建一个函数,该函数仅保留 ID 列(存储为字符串向量)重复的行。请注意,如果有多个 ID 列,我只想保留 ID 列组合重复的行。
library(data.table)
dt <- data.table(x = c(1:5,5), y = rep(c(1,3,5), each = 2), z = rep(1:3, 2))
get_duplicate_id_rows1 <- function(dt_in, id_str) {
dt_in[, if(.N > 1) .SD, by = id_str]
}
get_duplicate_id_rows1(dt, c("x", "y"))
#> x y z
#> 1: 5 5 2
#> 2: 5 5 3
get_duplicate_id_rows1(dt[, .(x,y)], c("x", "y"))
#> Empty data.table (0 rows and 2 cols): x,y
如上所述,当数据表有一个非 ID 列时,我的第一次尝试有效。但是,当所有列都是 ID 列时,则数据表没有行。我认为这是因为,根据?data.table,.SD 包括原始数据表的所有变量,分组行除外。因此,.SD 的列为零,这似乎是导致我的问题的原因。
get_duplicate_id_rows2 <- function(dt_in, id_str) {
dt_in[, if(.N > 1) .SD, by = id_str, .SDcols = names(dt_in)]
}
get_duplicate_id_rows2(dt, c("x", "y"))
#> x y x y z
#> 1: 5 5 5 5 2
#> 2: 5 5 5 5 3
get_duplicate_id_rows2(dt[, .(x,y)], c("x", "y"))
#> x y x y
#> 1: 5 5 5 5
#> 2: 5 5 5 5
我的第二次尝试尝试使用.SDcols 来规避我第一次尝试时遇到的问题。这确实解决了我的数据表中的所有列都是 ID 列的问题。但是,这里id_str 中的列名是重复的。
我认为这是因为一组列名来自by 参数,而另一组列名来自.SDcols,尽管我对此不确定,因为在我的第一次尝试中,结果数据表有零个行,而不是零个列。
因此,我很想了解这里发生了什么,以及对我的问题最有效的解决方案是什么 - 特别是对于大型数据集,这就是我从 tidyverse 迁移到 data.table 的原因。
由reprex package (v0.3.0) 于 2020-04-09 创建
【问题讨论】:
标签: r data.table