首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据不同的类找到多少唯一的值

如何根据不同的类找到多少唯一的值
EN

Stack Overflow用户
提问于 2020-10-03 21:04:27
回答 3查看 67关注 0票数 2

我的数据是一组大数据。每个唯一ID包括一个或多个类,每个类包含一个或多个X的唯一值。但是,我们可能在不同的ID中有相同的类(例如,ID009和ID020有相同的类),我试图根据不同的ID来找出每个类值X的唯一值。

代码语言:javascript
复制
ID <- c("ID004", "ID004", "ID004", "ID004", "ID004", "ID004", "ID006", "ID006", "ID006", "ID006", "ID006", "ID006", "ID006", "ID006", "ID006", "ID006", "ID006", "ID006", "ID006", "ID006", "ID006", "ID006", "ID009", "ID009", "ID009", "ID009", "ID009", "ID009", "ID009","ID020", "ID020", "ID020", "ID020", "ID020", "ID020", "ID020", "ID020", "ID023", "ID023", "ID023", "ID023", "ID023", "ID023","ID023", "ID023", "ID023", "ID023")
Class <- c("CMP-001", "CMP-001", "CMP-001", "CMP-001", "CMP-001","CMP-001", "CMP-001", "CMP-001", "CMP-001", "CMP-001", "CMP-001","CMP-001", "CMP-001", "CMP-001", "CMP-002", "CMP-002", "CMP-002","CMP-002", "CMP-002", "CMP-005", "CMP-005", "CMP-005", "CMP-002", "CMP-002", "CMP-002", "CMP-002", "CMP-002","CMP-002", "CMP-002", "CMP-002", "CMP-002", "CMP-002", "CMP-002", "CMP-002","CMP-002", "CMP-004", "CMP-004", "CMP-001", "CMP-001", "CMP-001", "CMP-001", "CMP-001","CMP-001", "CMP-001", "CMP-001", "CMP-001", "CMP-001")
X <- c(1,1,2,3,3,3,4,4,4,4,4,4,4,4,5,5,6,6,6,7,7,8,9,9,10,10,10,10,10,11,11,12,12,13,13,14,14,15,15,15,16,16,17,17,18,18,18)
data <- data.frame(ID, Class, X)

结果应该是;

代码语言:javascript
复制
ID         class       No. of X value
ID004     CMP-001           3
ID006     CMP-001           1
          CMP-002           2
          CMP-005           2
ID009     CMP-002           2
ID020     CMP-002           3
          CMP-004           1
ID023     CMP-001           4

谢谢你的帮助,

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-10-03 21:06:03

在这里,在使用“ID”、“类”进行分组之后,n_distinct是有用的。

代码语言:javascript
复制
library(dplyr)
data %>% 
   group_by(ID, Class) %>%
   summarise(No_X_value = n_distinct(X), .groups = 'drop')

-output

代码语言:javascript
复制
# A tibble: 8 x 3
#  ID    Class   No_X_value
#  <chr> <chr>        <int>
#1 ID004 CMP-001          3
#2 ID006 CMP-001          1
#3 ID006 CMP-002          2
#4 ID006 CMP-005          2
#5 ID009 CMP-002          2
#6 ID020 CMP-002          3
#7 ID020 CMP-004          1
#8 ID023 CMP-001          4

或使用data.table

代码语言:javascript
复制
library(data.table)
setDT(data)[, .(No_X_value = uniqueN(X), .(ID, Class)]

或者将base Raggregate结合使用

代码语言:javascript
复制
aggregate(X ~ ., unique(data), FUN = length)
#     ID   Class X
#1 ID004 CMP-001 3
#2 ID006 CMP-001 1
#3 ID023 CMP-001 4
#4 ID006 CMP-002 2
#5 ID009 CMP-002 2
#6 ID020 CMP-002 3
#7 ID020 CMP-004 1
#8 ID006 CMP-005 2
票数 2
EN

Stack Overflow用户

发布于 2020-10-03 21:09:30

您还可以在base R中使用像这样的aggregate()方法

代码语言:javascript
复制
#Code
df <- aggregate(X~ID+Class,data,function(x) length(unique(x)))

输出:

代码语言:javascript
复制
     ID   Class X
1 ID004 CMP-001 3
2 ID006 CMP-001 1
3 ID023 CMP-001 4
4 ID006 CMP-002 2
5 ID009 CMP-002 2
6 ID020 CMP-002 3
7 ID020 CMP-004 1
8 ID006 CMP-005 2
票数 1
EN

Stack Overflow用户

发布于 2020-10-03 22:27:06

如果你使用基数R,我认为aggregate @akrun的方法已经是一个非常有效的方法了。下面是另一个选择,但更复杂。

代码语言:javascript
复制
subset(as.data.frame(xtabs(cnt ~ ID + Class,cbind(cnt = 1,unique(data)))),Freq >0)

这给

代码语言:javascript
复制
      ID   Class Freq
1  ID004 CMP-001    3
2  ID006 CMP-001    1
5  ID023 CMP-001    4
7  ID006 CMP-002    2
8  ID009 CMP-002    2
9  ID020 CMP-002    3
14 ID020 CMP-004    1
17 ID006 CMP-005    2
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64188980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档