计算符合两个条件的ID数

时间:2018-09-18 16:51:00

标签: r

我有一个包含两列的数据集。一个是用户名,另一个是公司类型,如下所示:

    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。

3 个答案:

答案 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)