【问题标题】:R data.table get unique rows dropping some columns as wellR data.table 获得唯一的行,也删除了一些列
【发布时间】:2015-08-09 17:09:37
【问题描述】:

如何从 data.table 中获取唯一行,同时从结果中删除一些列,其中唯一性由多于一列中的值定义?例如:

tbl = data.table( 
  reader_id = c(10,20,20,30,50), 
  book_id = c(1,2,2,4,5), 
  date = c('d1','d2','d3','d4','d5'),
  inf = c('i1','i2','i3','i4','i5')
  )

 >tbl
   reader_id book_id date inf
1:        10       1   d1  i1
2:        20       2   d2  i2
3:        20       2   d3  i3
4:        30       4   d4  i4
5:        50       5   d5  i5

ut = unique(tbl[c(reader_id, book_id)])

结果我得到:

   reader_id book_id date inf
1:        NA      NA   NA  NA
2:        10       1   d1  i1
3:        20       2   d2  i2
4:        30       4   d4  i4
5:        50       5   d5  i5

问题:

  1. 为什么结果有 NA 值?如何摆脱它们?
  2. 如何从结果中删除inf 列?

改为:

   reader_id book_id date 
1:        10       1   d1  
2:        20       2   d2  
3:        30       4   d4  
4:        50       5   d5 

【问题讨论】:

  • ut = unique(tbl, by = c("reader_id", "book_id")) 见 ?data.table::unique

标签: r data.table


【解决方案1】:

这个怎么样:

R> unique(tbl, by=c("reader_id", "book_id"))[,-4]
#    reader_id book_id date
# 1:        10       1   d1
# 2:        20       2   d2
# 3:        30       4   d4
# 4:        50       5   d5

或者,如果您更喜欢按名称删除,

unique(tbl,by=c("reader_id", "book_id"))[,!"inf"]

【讨论】:

  • 我觉得unique(tbl[, inf := NULL], by=c("reader_id", "book_id"))更好
  • @DavidArenburg 但这也会从原始tbl 中删除inf。我建议之后删除infut <- unique(tbl, by = c("reader_id", "book_id"))[, inf := NULL] 不会改变tbl。顺便说一句,这里使用了链接。
  • @UweBlock 好的,我猜你也可以这样做。是的,我看到您正在使用链接,感谢您告诉我。
【解决方案2】:
tbl[,.SD[1],by=c('reader_id','book_id')]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多