我认为这个非常简单的问题有一个非常简单的解决方案,但我无法弄清楚。
让我们说我有一个数据表,其中有一些重复的行(第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
使用unique(dt)[, val3 := ....]
进行更新联接时,我已经快要到了,但是我无法获得...
部分来返回我想要的东西,这使我发疯。
答案 0 :(得分:3)
简单
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]