考虑最小工作示例(例如,对于二项式模型):
test.a.tset <- rnorm(10)
test.b.tset <- rnorm(10)
c <- runif(10)
c[c < 0.5] <- 0
c[c >= 0.5] <- 1
df <- data.frame(test.a.tset,test.b.tset,c)
使用正则表达式,我想对结构为c
的所有变量进行test."anything".tset
回归:
summary(glm(paste("c ~ ",paste(colnames((df[, grep("test\\.\\w+\\.tset", colnames(df))])),
collapse = "+"), sep = ""), data = df, family=binomial))
到目前为止,没有问题。现在我们到达cbind
发挥作用的部分。假设我想使用不同的统计模型(例如rbprobitGibbs
包中的bayesm
),这需要设计矩阵作为输入。
因此,我需要将数据帧转换为适当的格式。
X <- cbind(df$test.a.tset,df$test.b.tset)
或者,如果我想再次使用正则表达式(我甚至添加第二个grep
以确保只选择引号内的部分):
X2 <- cbind(grep("[^\"]+",paste(paste("df$", colnames((df[, grep("test\\.\\w+\\.tset", colnames(df))])),
sep = ""), collapse = ","), value = TRUE))
但是有区别:
> X
[,1] [,2]
[1,] -0.4525601 -1.240484170
[2,] 0.3135625 1.240519383
[3,] -0.2883953 -0.554670224
[4,] -1.3696994 -1.373690426
[5,] 0.8514529 -0.063945537
[6,] -1.1804205 -0.314132743
[7,] -1.0161170 -0.001605679
[8,] 1.0072168 0.938921869
[9,] -0.8797069 -1.158626865
[10,] -0.9113297 1.641201924
> X2
[,1]
[1,] "df$test.a.tset,df$test.b.tset"
从我的观点来看,问题似乎是grep
将所选值作为引号内的字符串返回,而glm
则忽略"df$test.a.tset,test.b.tset"
中的引号,cbind
没有。
即粘贴后对X2的调用实际上读为:
X2 <- cbind("df$test.a.tset,df$test.b.tset")
问题:有没有办法使用正则表达式为X2
得到与X
相同的结果?
答案 0 :(得分:1)
代码grep("test\\.\\w+\\.tset", colnames(df))
将返回与您的模式匹配的列的索引。如果您只想使用这些列构建矩阵,可以使用:
X3 <- as.matrix(df[,grep("test\\.\\w+\\.tset", colnames(df))])