首页 > 解决方案 > 按唯一行计算重复行

问题描述

我认为这个非常简单的问题有一个非常简单的解决方案,但我无法弄清楚。

假设我有一个带有一些重复行的 data.table(第 3 行和第 4 行是相同的)

dt <- data.table( val1 = c(1,2,3,3,4,5,6), val2 = 8 )             
#    val1 val2
# 1:    1    8
# 2:    2    8
# 3:    3    8
# 4:    3    8
# 5:    4    8
# 6:    5    8
# 7:    6    8

我想丢弃重复的行,只保留唯一的行,并引入一个新列val3来指示一行在原始数据中出现的频率

预期输出:

dt.output <- data.table( val1 = c(1,2,3,4,5,6), val2 = 8, val3 = c(1,1,2,1,1,1) )             
#    val1 val2 val3
# 1:    1    8    1
# 2:    2    8    1
# 3:    3    8    2
# 4:    4    8    1
# 5:    5    8    1
# 6:    6    8    1

我有一种感觉,我几乎可以使用 update-join with unique(dt)[, val3 := ....],但我无法让...部件返回我想要的东西,这让我发疯。

标签: rdata.table

解决方案


简单地

dt[, .(val3 = .N), by = .(val1, val2)]

或者继续您的第一种方法,可以执行以下操作:

unique(dt)[, val3 := dt[.SD, on = .(val1, val2), .N, by = .EACHI][, N]][]

请注意,也可以在 中使用字符向量by

byvars <- grep("val\\d+", names(dt), value = TRUE)
dt[, .(val3 = .N), by = byvars]

推荐阅读