【问题标题】:Unique count for one column - split by delimiter and unique count for substring一列的唯一计数 - 按分隔符和子字符串的唯一计数拆分
【发布时间】:2017-10-13 23:16:06
【问题描述】:

我想用'|'分割列 x 的唯一计数 x 值和子串在 R 中留下 2 个字符。

df <-data.frame(id = c(11,22,33,44),
                x = c(NA,'cna|cnb|jpa|usa|jpb|usb','kra|krb|kru|usb|usa','jpa|jpu|epa|epb|usa|woa|cna|jpu'))

> df
  id                               x
1 11                            <NA>
2 22         cna|cnb|jpa|usa|jpb|usb
3 33             kra|krb|kru|usb|usa
4 44 jpa|jpu|epa|epb|usa|woa|cna|jpu

我想在下面。

  id    count
1 11    0
2 22    3
3 33    2         
4 44    5
  • 第 1 行是 0
  • 第 2 行是 cn,jp,us(3 个数据)
  • 第 3 行是 kr,us(2 个数据)
  • 第 4 行是 jp,ep,us,wo,cn(5 个数据)

【问题讨论】:

    标签: r split count substring distinct


    【解决方案1】:

    我们可以使用tidyverse。我们将'x'中的元素拆分并扩展为长格式separate_rowsmutate'x'只取前两个字符(substr),按'id'分组,找到count使用n_distinct的唯一非NA元素

    library(tidyverse)
    df %>% 
        separate_rows(x) %>% 
        mutate(x= substr(x, 1, 2)) %>%
        group_by(id) %>% 
        summarise(count =  n_distinct(x[!is.na(x)]))
    # A tibble: 4 x 2
    #     id count
    #  <dbl> <int>
    #1    11     0
    #2    22     3
    #3    33     2
    #4    44     5
    

    【讨论】:

      【解决方案2】:

      这是另一种方法。它不像akrun 的回答那样紧凑和简单,但它不依赖于任何库:

      df$count <- sapply(df$x, function(varx){
          strs <- unique(sapply(unlist(strsplit(varx, "|", fixed = T)), function(string){
              substr(string, 1, 2)
          })) 
          length(strs[!is.na(strs)])
      })
      

      输出:

        id                               x count
      1 11                            <NA>     0
      2 22         cna|cnb|jpa|usa|jpb|usb     3
      3 33             kra|krb|kru|usb|usa     2
      4 44 jpa|jpu|epa|epb|usa|woa|cna|jpu     5
      

      【讨论】:

      • 短一点:sapply(sapply(strsplit(as.character(df$x),'\\|'), substr, start = 1, stop = 2), function(x) length(unique(na.omit(x))))
      • @Jaap,更短一点(少一个)将是sapply(strsplit(as.character(df$x), "|", fixed = TRUE), function(x) length(unique(substr(na.omit(x), 1, 2))))
      • 太棒了~!解决办法就是这么简单!非常感谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-03
      • 2021-09-20
      • 2023-03-22
      • 1970-01-01
      • 2020-02-15
      • 1970-01-01
      相关资源
      最近更新 更多