【问题标题】:Turning characters into expression把文字变成表情
【发布时间】:2015-07-15 16:49:34
【问题描述】:

我的 testData 中有几个数值变量:

testData<-data.frame(a1=1:10, a2=2:11, b1=101:110, b2=102:111)

我正在提取变量的名称如下:

a<-names(select(test, starts_with("a")))
b<-names(select(test, starts_with("b")))

然后我正在创建以下组合:

vardata<-expand.grid(a, b)   
vars<-paste(vardata$Var1,vardata$Var2,"=",vardata$Var1,"-",vardata$Var2)   
vars<-gsub("\\s+|\\s+?", "", vars) 

如果你运行 vars,你应该得到:

"a1b1=a1-b1" "a2b1=a2-b1" "a1b2=a1-b2" "a2b2=a2-b2"

现在当把它传递给 DPLYR mutate 函数时,我得到一个错误:

testData2<-mutate(testData, parse(text=vars))    

Error: unsupported type for column 'parse(text = vars)' (EXPRSXP, classes = expression)

有人可以帮忙吗? 谢谢

【问题讨论】:

    标签: r


    【解决方案1】:

    请记住,调用(标记)中的= 与表达式(赋值)中的= 不同。您可以通过这种方式建立对mutate 的适当调用,尽管它有点难看:

    > C <- call("mutate", quote(testData))
    > for(e in parse(text=vars)) {C[as.character(e[[2]])] <-  e[3]; print(C) }
    mutate(testData, a1b1 = a1 - b1)
    mutate(testData, a1b1 = a1 - b1, a2b1 = a2 - b1)
    mutate(testData, a1b1 = a1 - b1, a2b1 = a2 - b1, a1b2 = a1 -
        b2)
    mutate(testData, a1b1 = a1 - b1, a2b1 = a2 - b1, a1b2 = a1 -
        b2, a2b2 = a2 - b2)
    

    然后:

    >eval(C)
       a1 a2  b1  b2 a1b1 a2b1 a1b2 a2b2
    1   1  2 101 102 -100  -99 -101 -100
    2   2  3 102 103 -100  -99 -101 -100
    3   3  4 103 104 -100  -99 -101 -100
    4   4  5 104 105 -100  -99 -101 -100
    5   5  6 105 106 -100  -99 -101 -100
    6   6  7 106 107 -100  -99 -101 -100
    7   7  8 107 108 -100  -99 -101 -100
    8   8  9 108 109 -100  -99 -101 -100
    9   9 10 109 110 -100  -99 -101 -100
    10 10 11 110 111 -100  -99 -101 -100
    

    也就是说,有很多更简单的方法可以生成列的线性组合。

    【讨论】:

    • 这太好了,谢谢!正如您所提到的,我实际上正在寻找一种生成线性组合的简单方法。所以它不必通过 mutate 函数来完成。你能提出的任何建议都会很棒。谢谢
    猜你喜欢
    • 2017-12-05
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 2013-10-03
    • 2012-09-16
    • 1970-01-01
    • 2018-09-23
    • 1970-01-01
    相关资源
    最近更新 更多