正则表达式包含p3q10000c150
和p29q2990c98
等变量名称是什么?我想将p-any number-q-any number-c-any number
格式的所有变量添加到R。
谢谢!
答案 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()
将返回TRUE
和FALSE
值的向量,指示names(df)
中的哪个元素遵循您建议的结构。之后,您使用grepl()
的输出来对数据框进行子集化。
为清楚起见,请注意:
var_names_test <- c("p3q10000c150", "p29q2990c98", "var1")
grepl("p\\d+q\\d+c\\d", var_names_test)
# [1] TRUE TRUE FALSE