【发布时间】:2020-05-09 14:14:16
【问题描述】:
Nube 在这里尝试学习 R.. 我有一个数据框,并试图以编程方式从某些列构造一个矩阵。在语法上玩得不亦乐乎。
这是输入数据
XV= 0.5 0.5 1 1.5 3.5 5.5 7 9 NA NA NA NA NA NA NA NA
YV= 5 10 25 15 15 25 25 45 NA NA NA NA NA NA NA NA
type= 1BP2 2B 1BP2 2BP 1BP2 1BP2 1BP2 1BP2 NA NA NA NA NA NA NA NA
这里是df
我不知道有多少行,但 ZL 项的数量与 XL 变量的数量相同,并且 ZL 变量的列数与 YL 变量的行数一样多。这一切都导致了一个简单的 2D 插值算法,我正在尝试构建查找矩阵。
代码是这样的
z <- curvsx(XV,YV,type,lookupfile)
in curvsx...
curvsx <- function(xi,yi,type,dfname) {
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" 上面的代码产生
TYPE
"1BP2"
Nxl
7
Nyl
3
xl
1 2 3 4 5 6 7
attr(,"na.action")
attr(,"class")
"omit"
yl
10 20 30
attr(,"na.action")
4 5 6 7 8
attr(,"class")
"omit"
#this works but is clunky... (print statements to aid debug)
for (i in 1:Nyl) {
zl<-eval(parse(text=(paste("na.omit(df$ZL",i,TYPE,")",sep=""))))
if(i==1) {zo<-matrix(zl,nrow=Nxl,byrow=FALSE)}
else {zo<-matrix(c(zo,zl),nrow=Nxl,byrow=FALSE)}
print(zo)
}
# produces...
[,1] [,2] [,3]
[1,] 100 200 300
[2,] 200 300 400
[3,] 300 600 1000
[4,] 400 900 1600
[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)
# results in...
> zo
[,1] [,2] [,3]
[1,] 300 1600 3400
[2,] 400 2200 300
[3,] 1000 2800 400
当我尝试通过查看它来调试 1 班轮时...
paste("na.omit(df$ZL",i=1:Nyl,TYPE,")",sep="")
# produces
"na.omit(df$ZL11BP2)" "na.omit(df$ZL21BP2)" "na.omit(df$ZL31BP2)"
parse(text=(paste("na.omit(df$ZL",i=1:Nyl,TYPE,")",sep="")))
# produces
expression(na.omit(df$ZL11BP2), na.omit(df$ZL21BP2),
na.omit(df$ZL31BP2))
# but things seem to go south on
c(eval(parse(text=(paste("na.omit(df$ZL",i=1:Nyl,TYPE,")",sep="")))))
#which produces
300 400 1000 1600 2200 2800 3400
# what I was hoping for, I thought I was executing this
c(na.omit(df$ZL11BP2), na.omit(df$ZL21BP2), na.omit(df$ZL31BP2))
# which produces what I want...
100 200 300 400 500 600 700 200 300 600 900 1200 1500 1800 300 400 1000 1600 2200 2800 3400
我错过了什么或不理解什么
谢谢
【问题讨论】:
-
您好,欢迎来到 SO!您能否在尝试之前编辑您的问题并插入所需的输出?
-
谢谢 nicola,我重读了我的帖子,甚至我都无法理解!添加了一些缺失的细节。在最底层是问题,我认为我应该将 3 个向量组合成一个矩阵,但是在构建的表达式周围添加 c() 并没有像我预期的那样......
标签: r dataframe parsing matrix eval