R#正则表达式为p#q#c#

时间:2017-11-15 12:29:36

标签: r regex

正则表达式包含p3q10000c150p29q2990c98等变量名称是什么?我想将p-any number-q-any number-c-any number格式的所有变量添加到R。

中的列表中

谢谢!

4 个答案:

答案 0 :(得分:2)

如果您的目标是提取3个数字并将它们放在3列数据框或矩阵中,那么任何这些替代方案都可以做到。

#1中的正则表达式匹配p,然后是一个或多个数字,然后是q,然后是一个或多个数字,然后是c和一个或多个数字。括号形成捕获组,它们放在作为第三个参数给出的原型数据帧的相应列中。

在#2中,每个非数字("\\D")都替换为空格,然后read.table使用指定的列名读取数据。

在#3中,我们将input的每个元素转换为DCF格式,即c("\np: 3\nq: 10000\nc: 150", "\np: 29\nq: 2990\nc: 98"),然后使用read.dcf将其读取,并将列转换为数字。这会创建一个矩阵,而前两个备选方案会创建数据帧。

第二种选择似乎最简单,但第三种选择更为通用,因为它不会对标题名称或列数进行硬编码。 (如果我们在#2中使用col.names = strsplit(input, "\\d+")[[1]]那么它将是类似的一般。)

# 1
strcapture("p(\\d+)q(\\d+)c(\\d+)", input, 
   data.frame(p = character(), q = character(), c = character()))

# 2
read.table(text = gsub("\\D", " ", input), col.names = c("p", "q", "c"))

# 3
apply(read.dcf(textConnection(gsub("(\\D)", "\n\\1: ", input))), 2, as.numeric)

上面的前两个给出了这个data.frame,第三个给出了相应的数字矩阵。

   p     q   c
1  3 10000 150
2 29  2990  98

注意: input假设为:

input <- c("p3q10000c150", "p29q2990c98")

答案 1 :(得分:2)

我认为您正在matches中寻找类似dplyr::select功能的内容:

df = data.frame(1:10, 1:10, 1:10, 1:10)
names(df) = c("p3q10000c150", "V1", "p29q2990c98", "V2")

library(dplyr)

df %>%
  select(matches("^p\\d+q\\d+c\\d+$"))

<强>结果:

   p3q10000c150 p29q2990c98
1             1           1
2             2           2
3             3           3
4             4           4
5             5           5
6             6           6
7             7           7
8             8           8
9             9           9
10           10          10
matches中的

select允许您使用正则表达式来提取变量。

答案 2 :(得分:1)

尝试:

x <- c("p3q10000c150", "p29q2990c98")

sapply(strsplit(x, "[pqc]"), function(i){
  setNames(as.numeric(i[-1]), c("p", "q", "c"))
  })

#    [,1] [,2]
# p     3   29
# q 10000 2990
# c   150   98

答案 3 :(得分:1)

我假设你有一个名为df的数据框,变量名为names(df)。如果您只想保留结构p<somenumbers>q<somenumbers>c<somenumbers>的变量,您可以使用WiktorStribiżew在评论中建议的正则表达式:

valid_vars <- grepl("p\\d+q\\d+c\\d", names(df))
df2 <- df[, valid_vars]

grepl()将返回TRUEFALSE值的向量,指示names(df)中的哪个元素遵循您建议的结构。之后,您使用grepl()的输出来对数据框进行子集化。

为清楚起见,请注意:

var_names_test <- c("p3q10000c150", "p29q2990c98", "var1")
grepl("p\\d+q\\d+c\\d", var_names_test)
# [1] TRUE TRUE FALSE