如何按ID分组统计R data.table多列中的唯一值?
解决方案
要实现按ID分组统计colA和colB两列的唯一值总数,你可以用以下两种简洁的data.table写法:
方法一:直接合并列元素
have[, .(UnN = uniqueN(c(colA, colB))), by = ID]
方法二:使用.SDcols指定目标列(适合多列场景)
如果后续需要统计更多列,用.SDcols会更灵活,不用逐个列名写:
have[, .(UnN = uniqueN(unlist(.SD))), by = ID, .SDcols = c("colA", "colB")]
两种方法运行后都会得到你想要的want结果:
ID UnN 1: 1 3 2: 2 3
你的代码无法运行的原因
我们来拆解你代码里的几个关键问题:
- 列引用错误:你写的
c("colA","colB")是创建了一个包含两个字符串的向量,而不是提取这两列的实际数据。在data.table中,直接写列名(不加引号)才能引用列的内容。 by参数语法错误:C("ID")是错误的写法——C()是R中用于创建复数的函数,这里应该用by = ID(直接引用列名)或者by = "ID"(字符串形式指定分组列)。- j部分的语法不规范:虽然新版data.table支持直接写
UnN = ...,但更稳妥且符合规范的写法是用.()或list()包裹j部分的计算结果,比如.("UnN" = ...)。
修正后的代码(结合正确语法)就是上面给出的方法一啦。
内容的提问来源于stack exchange,提问作者LeGeniusII
相关产品推荐
相关产品推荐

