如何解决如何根据不同的类别查找多少个唯一值
我的数据来自大数据。每个唯一的ID都包含一个或多个类,并且每个类都包含一个或多个X的唯一值。但是,我们可能在不同的ID中具有相同的类(即ID009和ID020具有相同的类),我试图找出有多少个每个类别值的X的唯一值基于不同的ID。
ID <- c("ID004","ID004","ID006","ID009","ID020","ID023","ID023")
Class <- c("CMP-001","CMP-001","CMP-002","CMP-005","CMP-004","CMP-001")
X <- c(1,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,18)
data <- data.frame(ID,Class,X)
结果应该是;
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
感谢您的帮助,
解决方法
在这里,n_distinct
在对'ID','Class'进行分组之后会很有用
library(dplyr)
data %>%
group_by(ID,Class) %>%
summarise(No_X_value = n_distinct(X),.groups = 'drop')
-输出
# 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
library(data.table)
setDT(data)[,.(No_X_value = uniqueN(X),.(ID,Class)]
或将base R
与aggregate
一起使用
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
,
您还可以对base R
使用类似的aggregate()
方法:
#Code
df <- aggregate(X~ID+Class,data,function(x) length(unique(x)))
输出:
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
,
如果您使用的是基数R,我认为@akrun的aggregate
方法已经是一种超高效的方法。下面是另一个选择,但更复杂
subset(as.data.frame(xtabs(cnt ~ ID + Class,cbind(cnt = 1,unique(data)))),Freq >0)
给出
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。