如何将字符串作为R中的表达式求值

Nube在这里尝试学习R .. 我有一个数据框,正在尝试以编程方式从某些列构造矩阵。在语法上花了很长时间。

Here is the df dataframe

我不知道提前多少行,但是ZL术语与XL变量的编号相同,并且ZL变量的列与YL变量的行一样多。所有这些都导致了一个简单的2D插值算法,我正在尝试构建查找矩阵。

代码像这样

df <-read.csv(dfname)

xl <-eval(parse(text =(paste(“ na.omit(df $ XL”,TYPE,“)”,sep =“”)))))

Nxl <-length(na.omit(xl))

yl <-eval(parse(text =(paste(“ na.omit(df $ YL”,TYPE,“)”,sep =“”)))))

Nyl <-length(na.omit(yl))

上面的代码为TYPE =“ 1BP2”产生

类型

“ 1BP2”

Nxl

7

奈尔

3

l

1 2 3 4 5 6 7

attr(,“ na.action”)

attr(,“ class”)

“忽略”

yl

10 20 30

attr(,“ na.action”)

4 5 6 7 8

attr(,“ class”)

“忽略”

这可行,但笨重...(打印语句以帮助调试)

对于(i在1:Nyl中){

print(parse(text =(paste(“ na.omit(df $ ZL”,i,TYPE,“)”,sep =“”)))))

zl <-eval(parse(text =(paste(“ na.omit(df $ ZL”,i,TYPE,“)”,sep =“”)))))

打印(zl)

if(i == 1){zo <-matrix(zl,nrow = Nxl,byrow = FALSE)}

else {zo <-matrix(c(zo,zl),nrow = Nxl,byrow = FALSE)}

打印(zo)

}

生产...

表达式(na.omit(df $ ZL11BP2))

100200300400500600700

attr(,“ na.action”)

8

attr(,“ class”)

 [,1]

[1] 100

[2,] 200

[3,] 300

[4,] 400

[5,] 500

[6,] 600

[7,] 700

表达式(na.omit(df $ ZL21BP2))

2003006009001200120015001800

attr(,“ na.action”)

8

attr(,“ class”)

“忽略”

 [,1] [,2]

[1] 100200

[2,] 200300

[3,] 300600

[4,] 400900

[5,] 500 1200

[6,] 600 1500

[7,] 700 1800

表达式(na.omit(df $ ZL31BP2))

300400 1000 1600 2200 2800 3400

attr(,“ na.action”)

1 8

attr(,“ class”)

“忽略”

 [,1] [,2] [,3]

[1,] 100200300

[2,] 200300400

[3,] 3006001000

[4,] 4009001600

[5,] 500 1200 2200

[6,] 600 1500 2800

[7,] 700 1800 3400

这是我优雅地尝试在1行中完成的尝试,但是没有用...

zo = matrix(c(eval(parse(text =(paste(“ na.omit(df $ ZL”,i = 1:Nyl,TYPE,“)”,sep =“”)))))),ncol = Nyl ,byrow = FALSE)

结果是...

警告信息:

在矩阵中(c(eval(parse(text =(paste(“ na.omit(df $ ZL”,i = 1:Nyl,:

数据长度[7]不是行数[4]的约数或倍数

 [,1] [,2]

[1] 200 1200

[2,] 300 1500

[3,] 600 1800

[4,] 900200

当我尝试通过分段查看来调试1个班轮时...

paste(“ na.omit(df $ ZL”,i = 1:Nyl,TYPE,“)”,sep =“”)

产生

“ na.omit(df $ ZL11BP2)”“ na.omit(df $ ZL21BP2)”

parse(text =(paste(“ na.omit(df $ ZL”,i = 1:Nyl,TYPE,“)”,sep =“”)))

产生

表达式(na.omit(df $ ZL11BP2),na.omit(df $ ZL21BP2))

但是事情似乎往南走

c(eval(parse(text =(paste(“ na.omit(df $ ZL”,i = 1:Nyl,TYPE,“)”,sep =“”))))))

产生

2003006009001200120015001800

我希望的是,我以为我正在执行这个

c(na.omit(df $ ZL11BP2),na.omit(df $ ZL21BP2),na.omit(df $ ZL31BP2))

产生我想要的...

100200300400500600600700200300600900 1200 1500 1800 300400 1000 1600 2200 2800 3400

我缺少或不了解的内容

谢谢

评论