【问题标题】:Alternatives to mutate & rowwise & greplmutate & rowwise & grepl 的替代品
【发布时间】:2020-11-19 14:13:07
【问题描述】:

我正在处理如下所示的数据框,并希望计算 A 列中某些模式(“B”和“C”)的出现次数。

使用 rowwise、mutate 和 grepl 的代码确实有效,但使用 rowwise 非常慢。我想知道是否有任何替代方法来获得相同的结果?

temp <- data.frame(
  A = c('A','B','C','BC')
)

temp %>% 
  dplyr::rowwise() %>%
  mutate( B = sum(grepl(pattern = 'B',A),grepl(pattern = 'C',A) ) )

结果:

# A tibble: 4 x 2
# Rowwise: 
  A     Count
  <chr> <int>
1 A         0
2 B         1
3 C         1
4 BC        2

【问题讨论】:

    标签: r dplyr grepl rowwise


    【解决方案1】:

    grepl 是矢量化的,问题出在你的sum 上。请改用+

    temp %>% 
      mutate( 
        Count = grepl(pattern = 'B', A) + grepl(pattern = 'C', A)
      )
    #    A Count
    # 1  A     0
    # 2  B     1
    # 3  C     1
    # 4 BC     2
    

    和这个是一样的区别:

    sum(1:3,  1:3)
    # [1] 12
    
    1:3 + 1:3
    # [1] 2 4 6
    

    【讨论】:

    • 感谢 Gregor 指出根本问题!
    【解决方案2】:

    您可以使用stringr 中的str_count(),因为它是通过字符串和模式向量化的:

    temp %>%
     mutate(Count = str_count(A, "B|C"))
    
       A Count
    1  A     0
    2  B     1
    3  C     1
    4 BC     2
    

    【讨论】:

    • 谢谢 tmfmnk!我认为你的解决方案更清洁!
    【解决方案3】:

    带有nchargsubbase R 选项

    nchar(gsub("[^BC]", "", temp$A))
    #[1] 0 1 1 2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-30
      • 2016-01-10
      • 2022-11-22
      • 1970-01-01
      • 2018-02-16
      • 1970-01-01
      • 2021-07-24
      相关资源
      最近更新 更多