【问题标题】:How can I check if unique values of a column has multiple occurrences for different values of another column in R?如何检查列的唯一值是否多次出现在 R 中另一列的不同值?
【发布时间】:2021-09-10 17:11:42
【问题描述】:

样本数据:

set.seed(4)
cl <- sample(LETTERS[1:2], 100, replace = T)
seller <- round(runif(100, min=1, max=80))

df <- data.frame(cl, seller)

    cl seller
1    B     21
2    A     51
3    A     22
4    A     43
5    A     38
6    B     46
7    A     54
8    B     18
9    A     78
.......

99   A     32
100  B      8

我想检查 seller 的一个唯一值出现的次数 AB。假设在具有此特定种子的数据框中,您会看到 A 和 B 都出现了 7,因此将计算 7。

我的尝试:

df %>%
  filter(cl=='A')-> d1

df %>%
  filter(cl=='B')-> d2

d3 <- merge(d1, d2, by='seller') %>%
  distinct(seller)

nrow(d3)
17

所以,17 个卖家同时拥有 cl:A 和 B。

到目前为止,我的尝试非常不理想。它会产生结果,但必须有更好的方法来使用dplyr,甚至使用我无法弄清楚的基本R。此外,如果我这样做,对于更大的数据集将非常耗时。

我怎样才能以更好、更整洁的方式解决这个问题?

【问题讨论】:

    标签: r dplyr data-wrangling


    【解决方案1】:

    我们可以使用n_distinct(假设在“cl”列中仅找到“A”、“B”值):

    library(dplyr)
    df %>%
        group_by(seller) %>%
        summarise(n = n_distinct(cl), .groups = 'drop') %>%
        filter(n == 2) %>%
        nrow
    

    输出:

    [1] 17
    

    或者也可以

    df %>%
        group_by(seller) %>%
        summarise(n = all(c("A", "B") %in% cl), .groups = 'drop') %>%
        pull(n) %>%
        sum
    [1] 17
    

    【讨论】:

      【解决方案2】:

      使用 tablecolSumssum 的基本 R 方法

      sum(colSums(table(df) > 0) == 2)
      #[1] 17
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-30
        • 1970-01-01
        • 2013-11-17
        相关资源
        最近更新 更多