【问题标题】:Detect the presence or absence of a string in a pattern with R用R检测模式中是否存在字符串
【发布时间】:2020-07-29 15:08:58
【问题描述】:

我是 R 编码的初学者。我需要帮助找到一种优雅的方式来做到这一点:

我有以下数据框:

> df = data.frame(pattern=c('a,b,c','b','c,b','c'), nb=c(150,100,30,10))
> df
  pattern  nb
1   a,b,c  150
2       b  100
3     c,b  30
4       c  10

根据字符串的存在,我想要一个这样的数据框:

  pattern   nb    a    b     c
1   a,b,c   150   150  150   150
2       b   100   0    100   0
3     c,b   30    0    30    30
4       c   10    0    0     10

我找到了这个解决方案:

df$a <- ifelse(grepl("a" , df$pattern), df$nb, 0)
df$b <- ifelse(grepl("b" , df$pattern), df$nb, 0)
df$c <- ifelse(grepl("c" , df$pattern), df$nb, 0)

但在我的真实案例中,我得到了很多不同的模式。我确信有一种方法可以使用循环或函数。 当然,我并不是要一个现成的解决方案。我只是想知道如何做到这一点。 非常感谢。

来自法国的问候

阿诺

【问题讨论】:

    标签: r string loops dataframe


    【解决方案1】:

    dplyrtidyr 选项可以是:

    df %>%
     mutate(nb2 = nb,
            pattern_split = strsplit(pattern, ",", fixed = TRUE)) %>%
     unnest(pattern_split) %>%
     pivot_wider(names_from = "pattern_split", values_from = "nb2", values_fill = list(nb2 = 0))
    
      pattern    nb     a     b     c
      <chr>   <dbl> <dbl> <dbl> <dbl>
    1 a,b,c     150   150   150   150
    2 b         100     0   100     0
    3 c,b        30     0    30    30
    4 c          10     0     0    10
    

    【讨论】:

    • 非常感谢您快速有效的回答。它工作得很好。祝你有美好的一天。
    • 小记:当我按原样运行tmfmnk的解决方案时,我看到一个错误Error in strsplit(pattern, ",", fixed = TRUE) : non-character argument,可以通过使用stringsAsFactors = FALSE构造输入data.frame来解决。问题代码可以编辑,所以df = data.frame(pattern=c('a,b,c','b','c,b','c'), nb=c(150,100,30,10), stringsAsFactors = F)
    • Xilliam,感谢您的评论。我看到你发布了一个带有循环的解决方案,但我不再看到它了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    相关资源
    最近更新 更多