簡體   English   中英

計算符合兩個條件的ID數

[英]Count # of IDs that meet both criteria

我有一個包含兩列的數據集。 一個是用戶標識,另一個是公司類型,如下所示:

    userid      company.type
    1               A
    2               A
    3               C
    1               B
    2               B
    3               B
    4               A

我想知道有A和B或A和C(但不是B和C)的company.type的唯一用戶ID有多少個。

我假設它是某種聚合函數,但是我不確定如何將company.type的限定符放置為A和B或A和C。

我們可以使用table使用base R

tbl <- table(df1) > 0
sum(((tbl[, 1] & tbl[,2]) | (tbl[,1] & tbl[,3])) & (!(tbl[,2] & tbl[,3])))
#[1] 2

這是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))

請參閱: 檢查兩個向量是否在R中包含相同(無序)元素

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM