我有名为r1a r3c r5e r7g r9i r11k r13g r15i等的变量。我正在尝试以r5 - r12开头的select变量,并在R中创建一个数据格式。
我能写的最好的代码就是,
data %>% select(grep("r[5-9][^0-9]" , names(data), value = TRUE ),
grep("r1[0-2]", names(data), value = TRUE))考虑到我每天使用正则表达式的经验,我想知道是否有人能帮我编写一个更好、更紧凑的代码!
发布于 2018-02-13 22:25:54
下面是一个同时获取所有列的正则表达式:
data %>% select(grep("r([5-9]|1[0-2])", names(data), value = TRUE))垂直栏表示“或”。
正如评论所指出的那样,对于诸如r51这样的项目来说,这将失败,而且也可以缩短。相反,您需要稍微长一点的正则表达式:
data %>% select(matches("r([5-9]|1[0-2])([^0-9]|$)"))发布于 2018-02-13 22:22:52
假设在下面的代码中,x表示names(data)。然后下面的就会做你想做的事。
# 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"编辑.
您可以使用上述代码的泛化来创建一个函数。这个函数有三个参数,第一个是变量名的向量,第二个和第三个是你想要保持的数字的限制。
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"发布于 2018-02-14 01:56:54
删除非数字,扫描剩余部分,并检查每一个是否在5:12中:
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还可以这样编写:
library(magrittr)
DF %>% .[scan(text = gsub("\\D", "", names(.)), quiet = TRUE) %in% 5:12]
## r5e r7g r9i r11k
## 1 3 4 5 6https://stackoverflow.com/questions/48776515
复制相似问题