【问题标题】:Return a string between two characters '.'返回两个字符 '.' 之间的字符串
【发布时间】:2018-07-17 09:36:51
【问题描述】:

我的列名类似于以下

names(df_woe)

# [1] "A_FLAG" "woe.ABCD.binned" "woe.EFGHIJ.binned"       
 ...

我想通过删除“woe”来重命名列。和“.binned”部分,以便返回以下内容

names(df_woe)
# [1] "A_FLAG" "ABCD" "EFGHIJ"       
 ...

我已经尝试过substr(names(df_woe), start, stop),但我不确定如何设置变量启动/停止参数。

【问题讨论】:

  • 名称可以包含woe 部分但不包含binned(反之亦然)?
  • 不,他们都有“祸患”。和“.binned”,除了 A_FLAG 列
  • @Sotos 作为答案发布?

标签: r regex substr names


【解决方案1】:

另一种可能且可读的正则表达式可以是创建组并在第一个点之后和第二个点之前返回组,即

gsub("(.*\\.)(.*)\\..+", "\\2", names(df_woe))
#[1] "A_FLAG" "ABCD"   "EFGH"

【讨论】:

  • 为什么不简化为:gsub(".+\\.(.*)\\..+", "\\1", names(df_woe))
  • @snoram 那也是。也许还有 100 多个;)
  • 如果名称不包括第一部分,您将如何修改它,即“ABCD.binned”?
  • @NatalieKing 这就是为什么我在你的问题的 cmets 中问你,但你说 woe 和 binned 将永远同时存在。显然,如果缺少两者之一,我们需要使用不同的方法
  • @Sotos 在我的数据中,woe 和 binned 将永远存在。我只是好奇
【解决方案2】:
nam <- c("A_FLAG", "woe.ABCD.binned", "woe.EFGH.binned")
gsub("woe\\.|\\.binned", "", nam)
[1] "A_FLAG" "ABCD"   "EFGH"  

编辑:处理更复杂情况的解决方案,例如woe..binned.binned

gsub("^woe\\.|\\.binned$", "", nam)

【讨论】:

  • 如果是woe.binned.binned呢?
  • @PoGibas 好问题,也许 snoram 有答案,但这不适用于我的数据集。
  • @PoGibas 这将返回 binnedwoe..binned.binned 它返回 `` 我想可以单独处理(在不太可能的情况下)names(df_woe)[names(df_woe) == ""] &lt;- "so_woe_binned"
  • 如果名称不包括第一部分,您将如何修改它,即“ABCD.binned”?
  • 没关系,我自己弄明白了 gsub("|\\.binned", "", names(df_woe))
【解决方案3】:

另一种解决方案,使用stringr 包:

 str_replace_all("woe.ABCD.binned", pattern = "woe.|.binned", replacement = "")
 # [1] "ABCD"

【讨论】:

  • 这也很好用,谢谢!我也更喜欢这种方法,因为它看起来更干净(在我看来)
  • @zx8754 它的作用是我认为我们可以要求的一切。
  • 如果名称不包括第一部分,您将如何修改它,即“ABCD.binned”?
猜你喜欢
  • 2011-01-04
  • 1970-01-01
  • 2019-08-18
  • 1970-01-01
  • 2014-05-28
  • 1970-01-01
  • 1970-01-01
  • 2016-12-19
  • 1970-01-01
相关资源
最近更新 更多