【问题标题】:Count comma separated unique values in a string计算字符串中逗号分隔的唯一值
【发布时间】:2017-05-12 06:09:43
【问题描述】:

数据框的前两列构成一个复合键,并且有一列 char 类型的列包含逗号分隔的整数。我的目标是创建一个包含字符串中唯一整数计数的列。 我知道使用 str_split_fixed 将字符串转换为列然后计算唯一值的方法,但是由于字符串的长度,添加了大量列并且一切都滞后。还有其他方法吗? 实际数据集包含 500k 行和 53 列。 样本数据集:
df

c1      c2    c3  
aa      11   1,13,4,5,4,7,9    
bb      22   2,5,2,4,5,7,11,     
cc      33   11,14,3,1,    
dd      44   1,1,2,4,5,6,15,    
ee      55   4,3,3,1,14,17,

想要的输出:

c1        c2             c3             c4  
------ | ------   | ------          | -----   
aa     | 11       | 1,13,4,5,4,7,9  |  6    
------ | ------   | ------          | -----   
bb     | 22       | 2,5,2,4,5,7,11, |  5   
------ | ------   | ------          | -----   
cc     | 33       | 11,14,3,1,      |  4   
------ | ------   | ------          | -----   
dd     | 44       | 1,1,2,4,5,6,15, |  6       
------ | ------   | ------          | -----   
ee     | 55       | 4,3,3,1,7,17,7, |  5    
------ | ------   | ------          | -----  

任何帮助将不胜感激!

【问题讨论】:

    标签: r string unique


    【解决方案1】:

    data.table-package 中使用strsplituniqueN

    df$c4 <- sapply(strsplit(df$c3,','), uniqueN)
    

    给出:

    > df
      c1 c2              c3 c4
    1 aa 11  1,13,4,5,4,7,9  6
    2 bb 22 2,5,2,4,5,7,11,  5
    3 cc 33      11,14,3,1,  4
    4 dd 44 1,1,2,4,5,6,15,  6
    5 ee 55  4,3,3,1,14,17,  5
    

    注意:如果 df$c3 是一个因子变量,请将其包装在 as.character: sapply(strsplit(as.character(df$c3), ','), uniqueN)


    另一个用于创建df$c4 的基本 R 替代方案:

    sapply(regmatches(df$c3, gregexpr('\\d+', df$c3)), function(x) length(unique(x)))
    

    tidyverse 替代方案:

    library(dplyr)
    library(tidyr)
    df %>% 
      separate_rows(c3) %>% 
      filter(c3 != '') %>% 
      group_by(c1) %>% 
      summarise(c4 = n_distinct(c3)) %>% 
      left_join(df, .)
    

    【讨论】:

      【解决方案2】:

      我们可以使用stri_extract提取所有数字,然后循环遍历list,找到unique元素中的length

      library(stringi)
      df1$Count <- sapply(stri_extract_all_regex(df1$col3, "[0-9]+"), 
                           function(x) length(unique(x)))
      

      【讨论】:

      • 谢谢!不知道 stri_extract_all_regex。将对此进行研究。
      • @ShubhangiSharma 看起来您的帖子已被编辑。谢谢
      • @ShubhangiSharma ,在 SO 中编辑表格很困难,但我建议使用 dput(dataframe) 粘贴您的数据样本,以便以最佳方式回答。谢谢
      【解决方案3】:

      假设您的 df 如下所示:

      df <- c("1,13,4,5,4,7,9,", "2,5,2,4,5,7,11,","11,14,3,1,4,"," 1,1,2,4,5,6,15,","4,6,3,3,1,14,17,14,")
      df <- gsub("\\s+|,$","",df) ##Removal of unnecssary spaces and trailing commas
      

      那么你可以使用 baseR

      unlist(lapply(strsplit(df,split=","),function(x)length(unique(x))))
      

      结果会是这样的:

      [1] 6 5 5 6 6
      

      【讨论】:

      • 您的结果略有错误,因为某些行中的尾随逗号没有数字
      • 感谢@docendodiscimus 知道了,这是因为在我的解决方案中添加了前导空格。它似乎工作正常。
      猜你喜欢
      • 1970-01-01
      • 2020-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-23
      • 1970-01-01
      相关资源
      最近更新 更多