【问题标题】:remove all rows with a character string ending with a specific string in R - grepl在R中删除所有以特定字符串结尾的字符串的行 - grepl
【发布时间】:2020-04-02 09:37:32
【问题描述】:

我想删除所有以“_bundle”结尾的行。我尝试了两种不同的方法,但如果可以工作,则没有

claimsVolumeSC <- basisPerClaim[!grepl( '$_bundle', basisPerClaim$subcoveragekey),]
levels(claimsVolumeSC$subcoveragekey)
claimsVolumeSC <- basisPerClaim[!grepl( '\\>_bundle', basisPerClaim$subcoveragekey),]
levels(claimsVolumeSC$subcoveragekey)

我怎样才能实现我想要的? 为什么到目前为止我尝试过的方法不起作用?

> claimsVolumeSC <- basisPerClaim[!grepl( '$_bundle', basisPerClaim$subcoveragekey),]
> levels(claimsVolumeSC$subcoveragekey)
[1] "DA_Chemo"         "Daily_cash"       "Funeral"          "IP_Accommodation" "IP_bundle"        "IP_Upgrade"       "OP_Dialysis"     
[8] "OP_Physio"       
> claimsVolumeSC <- basisPerClaim[!grepl( '\\>_bundle', basisPerClaim$subcoveragekey),]
> levels(claimsVolumeSC$subcoveragekey)
[1] "DA_Chemo"         "Daily_cash"       "Funeral"          "IP_Accommodation" "IP_bundle"        "IP_Upgrade"       "OP_Dialysis"     
[8] "OP_Physio"   

【问题讨论】:

  • basisPerClaim[!grepl( '_bundle$', basisPerClaim$subcoveragekey),]
  • 我仍然得到 > 级别(claimsVolumeSC$subcoveragekey)[1]“DA_Chemo”“Daily_cash”“Funeral”“IP_Accommodation”“IP_bundle”“IP_Upgrade”“OP_Dialysis”[8]“OP_Physio”跨度>
  • 您需要它们作为因子吗?您可以将它们转换为字符claimsVolumeSC$subcoveragekey &lt;- as.character(claimsVolumeSC$subcoveragekey)
  • 字符很好,谢谢我没有注意到...这是工作:)

标签: r grepl


【解决方案1】:

您可以将subsetgrepl 一起使用

claimsVolumeSC <- subset(basisPerClaim, !grepl( '_bundle$', subcoveragekey))

如果您不想要数据中的因子,请将它们更改为字符。

claimsVolumeSC$subcoveragekey <- as.character(claimsVolumeSC$subcoveragekey)

【讨论】:

    【解决方案2】:

    解决方案可能是这个基于正则表达式的解决方案:

    可重现的数据

    set.seed(123)
    df <- data.frame(
      Var1 = rnorm(100),
      Var2 = sample(c(paste0(LETTERS[1:10],letters[10:18], letters[18:26], letters), paste0(letters[1:10],"bundle")), 100, replace = T),
      Var3 = sample(c(paste0(LETTERS[1:10],letters), paste0(letters[1:10],"bundle")), 100, replace = T))
    
    head(df)
             Var1    Var2    Var3
    1 -0.56047565    Irzi cbundle
    2 -0.23017749 ibundle      Aa
    3  1.55870831    Bmuv cbundle
    4  0.07050839    Ijrs abundle
    5  0.12928774    Eowo      Cw
    6  1.71506499 fbundle      Hr
    

    解决方案

    在这里,我们将所有行 paste0 放在一起,使用 grepl 匹配所有 bundle 字符串,并从数据帧 which 中减去(-)这些行匹配模式:

    df[-which(grepl("bundle", apply(df, 1, paste0, collapse = " "))),]
    

    结果

    如果我们将子集数据帧存储为df2,结果是这样的:

    df2 <- df[-which(grepl("bundle", apply(df, 1, paste0, collapse = " "))),]
    
    head(df2)
             Var1 Var2 Var3
    5   0.1292877 Eowo   Cw
    7   0.4609162 Dnvn   Ff
    8  -1.2650612 Aksk   Aa
    9  -0.6868529 Gpxg   Gq
    10 -0.4456620 Gpxg   Hr
    11  1.2240818 Hrzr   Eo
    

    注意

    如果要匹配的字符串分散在多列中,此解决方案会很有帮助。如果匹配只出现在单个列中,则正常的子集程序就足够了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-06
      • 1970-01-01
      • 1970-01-01
      • 2011-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-04
      相关资源
      最近更新 更多