首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用正则表达式选择多列

使用正则表达式选择多列
EN

Stack Overflow用户
提问于 2018-02-13 22:11:59
回答 3查看 1.1K关注 0票数 2

我有名为r1a r3c r5e r7g r9i r11k r13g r15i等的变量。我正在尝试以r5 - r12开头的select变量,并在R中创建一个数据格式。

我能写的最好的代码就是,

代码语言:javascript
复制
data %>% select(grep("r[5-9][^0-9]" , names(data), value = TRUE ),
grep("r1[0-2]", names(data), value = TRUE))

考虑到我每天使用正则表达式的经验,我想知道是否有人能帮我编写一个更好、更紧凑的代码!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-02-13 22:25:54

下面是一个同时获取所有列的正则表达式:

代码语言:javascript
复制
data %>% select(grep("r([5-9]|1[0-2])", names(data), value = TRUE))

垂直栏表示“或”。

正如评论所指出的那样,对于诸如r51这样的项目来说,这将失败,而且也可以缩短。相反,您需要稍微长一点的正则表达式:

代码语言:javascript
复制
data %>% select(matches("r([5-9]|1[0-2])([^0-9]|$)"))
票数 2
EN

Stack Overflow用户

发布于 2018-02-13 22:22:52

假设在下面的代码中,x表示names(data)。然后下面的就会做你想做的事。

代码语言:javascript
复制
# The names of 'data'
x <- scan(what = character(), text = "r1a r3c r5e r7g r9i r11k r13g r15i")

y <- unlist(strsplit(x, "[[:alpha:]]"))
y <- as.numeric(y[sapply(y, `!=`, "")])
x[y > 4]
#[1] "r5e"  "r7g"  "r9i"  "r11k" "r13g" "r15i"

编辑.

您可以使用上述代码的泛化来创建一个函数。这个函数有三个参数,第一个是变量名的向量,第二个和第三个是你想要保持的数字的限制。

代码语言:javascript
复制
var_names <- function(x, from = 1, to = Inf){
    y <- unlist(strsplit(x, "[[:alpha:]]"))
    y <- as.integer(y[sapply(y, `!=`, "")])
    x[from <= y & y <= to]
}

var_names(x, 5)
#[1] "r5e"  "r7g"  "r9i"  "r11k" "r13g" "r15i"
票数 2
EN

Stack Overflow用户

发布于 2018-02-14 01:56:54

删除非数字,扫描剩余部分,并检查每一个是否在5:12中:

代码语言:javascript
复制
DF <- data.frame(r1a=1, r3c=2, r5e=3, r7g=4, r9i=5, r11k=6, r13g=7, r15i=8) # test data

DF[scan(text = gsub("\\D", "", names(DF)), quiet = TRUE) %in% 5:12]
##   r5e r7g r9i r11k
## 1   3   4   5    6

使用magrittr还可以这样编写:

代码语言:javascript
复制
library(magrittr)

DF %>% .[scan(text = gsub("\\D", "", names(.)), quiet = TRUE) %in% 5:12]
##   r5e r7g r9i r11k
## 1   3   4   5    6
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48776515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档