我有一个包含两列的数据集。一个是用户名,另一个是公司类型,如下所示:
userid company.type
1 A
2 A
3 C
1 B
2 B
3 B
4 A
我想知道有多少个唯一的用户ID,它们具有A.和B或A和C(但不包括B和C)的company.type。
我假设这是某种聚合函数,但是我不确定如何放置company.type的限定符必须是A和B或A和C。
答案 0 :(得分:2)
我们可以使用base R
通过table
来做到这一点
tbl <- table(df1) > 0
sum(((tbl[, 1] & tbl[,2]) | (tbl[,1] & tbl[,3])) & (!(tbl[,2] & tbl[,3])))
#[1] 2
答案 1 :(得分:1)
这里是dplyr
的想法。 setequal
检查两个向量是否由相同的元素组成,而不考虑顺序:
library(dplyr)
df %>%
group_by(userid) %>%
summarize(temp = setequal(company.type, c("A", "B")) |
setequal(company.type, c("A", "C"))) %>%
pull(temp) %>%
sum()
# [1] 2
数据:
df <- structure(list(userid = c(1L, 2L, 3L, 1L, 2L, 3L, 4L), company.type = c("A",
"A", "C", "B", "B", "B", "A")), .Names = c("userid", "company.type"
), class = "data.frame", row.names = c(NA, -7L))
请参阅:Check whether two vectors contain the same (unordered) elements in R
答案 2 :(得分:0)
将DF
排序,并使用types
列将其减少到每个用户ID一行,该列由逗号分隔的公司类型字符串组成。然后使用指示的条件对其进行过滤。最后使用tally
获取过滤后剩余的行数。要获取详细信息,请省略tally
行。
library(dplyr)
DF %>%
arrange(userid, company.type) %>%
group_by(userid) %>%
summarize(types = toString(company.type)) %>%
ungroup %>%
filter(grepl("A.*B|A.*C", types) & ! grepl("B.*C", types)) %>%
tally
给予:
# A tibble: 1 x 1
n
<int>
1 2
可重复使用的输入为:
Lines <- "userid company.type
1 A
2 A
3 C
1 B
2 B
3 B
4 A"
DF <- read.table(text = Lines, header = TRUE)