【问题标题】:cbind, grep and quotation marks in RR中的cbind,grep和引号
【发布时间】:2014-03-25 13:30:30
【问题描述】:

考虑一个最小的工作示例(例如二项式模型):

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)

使用正则表达式,我想在结构为 test."anything".tset 的所有变量上回归 c

summary(glm(paste("c ~ ",paste(colnames((df[, grep("test\\.\\w+\\.tset", colnames(df))])),
        collapse = "+"), sep = ""), data = df, family=binomial))

到目前为止,没有问题。现在我们进入cbind 发挥作用的部分。假设我想使用不同的统计模型(例如 bayesm 包中的 rbprobitGibbs),它需要一个设计矩阵作为输入。 因此,我需要将数据框转换为适当的格式。

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 不会. IE。粘贴后对 X2 的调用实际上读作:

X2 <- cbind("df$test.a.tset,df$test.b.tset")

问题:有没有办法使用正则表达式为X2 获得与X 相同的结果?

【问题讨论】:

    标签: r regex cbind


    【解决方案1】:

    代码grep("test\\.\\w+\\.tset", colnames(df)) 将返回与您的模式匹配的列的索引。如果您想仅使用这些列构建矩阵,则可以使用:

    X3 <- as.matrix(df[,grep("test\\.\\w+\\.tset", colnames(df))])
    

    【讨论】:

    • 谢谢,确实有效。为了更好地理解另外两个问题:首先,为什么它适用于glm?我想这是因为glm 也可以将列索引而不是名称作为参数。其次,如果我修改grep("test\\.\\w+\\.tset", colnames(df), value = TRUE) 并将其合并到示例中,它仍然会产生相同的结果。为什么? value = TRUE 在这种情况下似乎根本没有任何影响。如果是这样,在我的理解中,初始结果应该是"df$1,df$2"
    • 您可以按列号或名称索引数据框。如果您的数据框 df 包含 a、b 和 c 列,则 df[,c(2, 3)]df[,c("b", "c")] 是相同的。对于glm,您正在传递一个字符串,该字符串正在通过as.formula 函数转换为公式;您不是在尝试运行命令。如果要运行存储在文本字符串中的命令,请使用evalparse(类似于eval(parse(text="2+2")))。但是,这通常是不好的编码习惯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    • 2014-09-28
    • 1970-01-01
    相关资源
    最近更新 更多