【问题标题】:How do I extract the unique rows from a subset of columns in a data table?如何从数据表中的列子集中提取唯一行?
【发布时间】:2013-10-24 18:49:07
【问题描述】:

在给定列子集和i 中的条件的情况下,我想从 data.table 中获取唯一行。最好的方法是什么? (就计算速度和简短或可读的语法而言,“最好”)

set.seed(1)
jk <- data.table(c1 = sample(letters,60,replace = TRUE), 
                 c2 = sample(c(TRUE,FALSE),60, replace = TRUE), 
                 c3 = sample(letters,60, replace = TRUE),
                 c4 = sample.int(10,60, replace = TRUE)
                 )

假设我想找到c1c2 的唯一组合,其中c4 是10。我可以想到几种方法,但不确定哪种方法是最佳的。要提取的列是否带键也很重要。

## works but gives an extra column
jk[c4 >= 10, TRUE, keyby = list(c1,c2)]
## this removes extra column
jk[c4 >= 10, TRUE, keyby = list(c1,c2)][,V1 := NULL]

## this seems like it could work
## but no j-expression with a keyby throws an error
jk[c4 >= 10, , keyby = list(c1,c2)]

## using unique with .SD
jk[c4 >= 10, unique(.SD), .SDcols = c("c1","c2")]

【问题讨论】:

  • 就清晰度而言:unique(jk[c4 &gt;= 10, list(c1, c2)]) 似乎名列前茅。

标签: r unique data.table


【解决方案1】:

至少对我来说,最直接的方法是 @Justin 建议的 unique(jk[c4 &gt;= 10, list(c1, c2)])unique(jk[c4 &gt;= 10, c("c1", "c2")])。后者是迄今为止四个建议中最快的,至少在我的笔记本电脑上是这样:

microbenchmark(
a=jk[c4 >= 10, list(c1,c2), keyby = list(c1,c2)][,c("c1","c2")],
b=jk[c4 >= 10, unique(.SD), .SDcols = c("c1","c2")],
c=unique(jk[c4>=10,list(c1,c2)]),
d=unique(jk[c4>=10,c("c1","c2")])
)

Unit: microseconds
 expr      min       lq    median        uq      max neval
    a 1378.742 1456.676 1494.9380 1531.1395 2515.796   100
    b  906.404  943.072  963.7790  997.4930 3805.846   100
    c 1167.125 1201.988 1232.3500 1272.2250 2077.047   100
    d  627.768  653.314  669.8625  683.8045  739.808   100

【讨论】:

    猜你喜欢
    • 2017-10-08
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    • 2012-03-26
    • 1970-01-01
    • 2018-01-14
    • 1970-01-01
    相关资源
    最近更新 更多