我想使用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包(v0.3.0)于2020-04-09创建
id_str = c("x", "y", "z")
。get_duplicate_id_rows1(dt[, .(x,y)], c("x", "y"))
的输出。另外,你的答案产生了第三列i.z
,并且并非所有行的值都等于z
。 - user3646834.SD
后,你对为什么它返回0行的理解是正确的,即依据?data.table
,.SD
包括原始数据表的所有变量,除了分组行。因此,.SD
没有任何列,这似乎导致了我的问题。 - chinsoon12