【问题标题】:Count number of unique rows based on two columns, by group按组计算基于两列的唯一行数
【发布时间】:2016-03-26 08:43:01
【问题描述】:

我在 r 中有一个 data.table

    col1 col2 col3   col4
 1:  5.1  3.5  1.4 setosa
 2:  5.1  3.5  1.4 setosa
 3:  4.7  3.2  1.3 setosa
 4:  4.6  3.1  1.5 setosa
 5:  5.0  3.6  1.4 setosa
 6:  5.1  3.5  3.4    eer
 7:  5.1  3.5  3.4    eer
 8:  5.1  3.2  1.3    eer
 9:  5.1  3.5  1.5    eer
10:  5.1  3.5  1.4    eer


DT <- structure(list(col1 = c(5.1, 5.1, 4.7, 4.6, 5, 5.1, 5.1, 5.1, 
5.1, 5.1), col2 = c(3.5, 3.5, 3.2, 3.1, 3.6, 3.5, 3.5, 3.2, 3.5, 
3.5), col3 = c(1.4, 1.4, 1.3, 1.5, 1.4, 3.4, 3.4, 1.3, 1.5, 1.4
), col4 = structure(c(1L, 1L, 1L, 1L, 1L, 4L, 4L, 4L, 4L, 4L), .Label = c("setosa", 
"versicolor", "virginica", "eer"), class = "factor")), .Names = c("col1", 
"col2", "col3", "col4"), row.names = c(NA, -10L), class = c("data.table", 
"data.frame"))

我想为col4 的每个值计算col1col2 的唯一(不同)组合。

预期输出是

   col1 col2 col3   col4 count
 1:  5.1  3.5  1.4 setosa     4
 2:  5.1  3.5  1.4 setosa     4
 3:  4.7  3.2  1.3 setosa     4
 4:  4.6  3.1  1.5 setosa     4
 5:  5.0  3.6  1.4 setosa     4
 6:  5.1  3.5  3.4    eer     2
 7:  5.1  3.5  3.4    eer     2
 8:  5.1  3.2  1.3    eer     2
 9:  5.1  3.5  1.5    eer     2
10:  5.1  3.5  1.4    eer     2

如何仅在 1 个 data.table 语法中做到这一点?

【问题讨论】:

  • 这里有一些其他的非data.table方式:stackoverflow.com/questions/17421776/…
  • 我们是想只保留这个问题 data.table,还是扩展它以允许 dplyr 等?我问是因为它会成为一个完美的重复目标,例如this

标签: r count data.table


【解决方案1】:

我不得不先进行几次尝试,最终得到了这个。好用吗?

DT[, count:=nrow(unique(.SD)), by=col4, .SDcols=c("col1","col2")]
DT
    col1 col2 col3   col4 count
 1:  5.1  3.5  1.4 setosa     4
 2:  5.1  3.5  1.4 setosa     4
 3:  4.7  3.2  1.3 setosa     4
 4:  4.6  3.1  1.5 setosa     4
 5:  5.0  3.6  1.4 setosa     4
 6:  5.1  3.5  3.4    eer     2
 7:  5.1  3.5  3.4    eer     2
 8:  5.1  3.2  1.3    eer     2
 9:  5.1  3.5  1.5    eer     2
10:  5.1  3.5  1.4    eer     2
> 

由于下面的 Procrastinatus 评论,相同但更快:

DT[, count:=uniqueN(.SD), by=col4, .SDcols=c("col1","col2")]

【讨论】:

  • 我很惊讶你没有使用uniqueN。有什么具体原因吗?
  • 是的...... Arun 一直在努力前进,我忘记了 uniqueN!好的。看看它,如果DTcol1键控,我们是否应该设置它的by=NULL
  • 当我尝试这样做时,这只会给出col1 中唯一值的计数(这不是 OP 想要的)。顺便说一句:关于速度,似乎在大型数据集上使用length(unique())still faster than uniqueN
  • @MattDowle,是的,这是必要的,直到 by=seq_along(x) 成为默认值。
  • 在速度差异链接上,返回列数length不是唯一的,所以结果不一样?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多