【问题标题】:grep a var name with consecutive numbers as a suffixgrep 以连续数字作为后缀的 var 名称
【发布时间】:2013-01-25 00:28:05
【问题描述】:

我想要数据框中某些变量的索引,但我的grep() 技能不足。

假设我有这个数据框,

( dfn <- data.frame(
a1   = c(3,  3, 0,  3, 0,   0),
a2   = c(1, NA, 0, NA, 1,   4),
a11  = c(0,  3, NA, 1, 3,   1),
a12  = c(0,  3, NA, 1, 3,   3),
a_12 = c(0,  3, NA, 1, NA, NA),
a_1  = c(12, 3, NA, 1, 4,  NA)) )
  a1 a2 a11 a12 a_12 a_1
1  3  1   0   0    0  12
2  3 NA   3   3    3   3
3  0  0  NA  NA   NA  NA
4  3 NA   1   1    1   1
5  0  1   3   3   NA   4
6  0  4   1   3   NA  NA

现在,我想要grep a1、a2、a11 和 a12(在现实生活中,a' 之后的# 是从 1 到 12 的连续列表),怎么做我这样做?我已经尝试了下面的两个 grep 的,但没有成功。

foo <- grep('a[1:12]$', names(dfn) )
names(dfn[,foo])
[1] "a1" "a2"

我也试过这个,

bar <- grep('a[c(1:12)]$', names(dfn) )
names(dfn[,bar])
[1] "a1" "a2"

我想要的是

[1] "a1" "a2" "a11" "a12"

其次,谁能指导我到一个好的grep() 教程?谢谢!

【问题讨论】:

    标签: r regex data-manipulation


    【解决方案1】:

    你需要grep('a[1:12]+', names(dfn))

    实际上正确的做法是grep('a[1-9]+', names(dfn)) [1-9] 之后的 + 表示 1-9 中的值可以在 a 之后重复任意次数,但必须至少出现一次。

    【讨论】:

    • 你回答了我的问题,但我最终使用了@thelatemail 的答案,因为我意识到我的数据有一些变量a1_aa2_ba12_l 我也需要整理.我尝试在您的代码中的+ 之后添加$,但无法以这种方式解决。无论如何,我很感激你的回答!
    • @EricFail 你必须/应该检查确切问题的正确答案......因为问题和答案将被其他人使用......当然,我对这里所有的人表示敬意回答。
    • @agstudy,我已将 CAPSLOCK 的答案标记为正确答案,因为它解决了问题中指定的问题(并添加了一条说明,说明为什么我在真实数据上使用了 thelatemail 的解决方案)。
    【解决方案2】:
    regmatches(names(dfn),regexpr('a[1-9]{1,2}',names(dfn)))
    [1] "a1"  "a2"  "a11" "a12"
    

    我的正则表达式是:a 后跟 min =1 和 max =2 集合中的数字 [1-9]

    【讨论】:

      【解决方案3】:

      你可以这样做:

      names(dfn)[names(dfn) %in% paste0("a",1:12)]
      [1] "a1"  "a2"  "a11" "a12"
      

      如果你想要索引,这会给你:

      which(names(dfn) %in% paste0("a",1:12))
      [1] 1 2 3 4
      

      【讨论】:

      • 感谢您详尽的回答,但我很想知道@CAPSLOCK 已经提供的答案是否有任何优势?
      • 感谢您的更新,我正在寻找索引位置而不是名称。
      • 漂亮,谢谢。你不喜欢/使用paste0()吗?如果是这样,我很想知道为什么。
      • @EricFail - 我在 2.14 版本的记忆棒上使用便携式版本的 R,当我检查代码时,paste0 不存在。我没有任何反对意见。
      • 啊我也想发布这个答案!但我不确定 12 是实际上限还是仅用于例如 =P
      猜你喜欢
      • 1970-01-01
      • 2023-01-05
      • 1970-01-01
      • 1970-01-01
      • 2017-06-17
      • 1970-01-01
      • 2016-07-25
      • 1970-01-01
      • 2018-07-18
      相关资源
      最近更新 更多