从坐标表中获取数据作为输入

时间:2018-03-08 16:24:39

标签: r regex gsub

我有一个99行的矩阵,名为r010,r020,... r990和99个cols,名为c010,c020,... c990。

此外,我已经为每一行和每一列定义了变量,例如r010。 该变量包含行r010中的所有数据。

我的输入数据可以包含"{r010, c070} + {r020, c070} == {r030, c090}"之类的值。所以在这里调用Matrix的特定CELLS非常重要。 如果输入数据类似{r010,c070},我希望 R 进入第1行(r010)和第7列(c070)的矩阵。

所以我需要一个能够检测","并给出矩阵的那个单元格中的值("左侧的行;"左侧的col)

其工作原理如下:

s    <- "{r390, c010} == {r400, c010} + {r410, c010} + {r420, c010}"

pat  <- "\\d+(?>\\d)\\B"
pat2 <- "\\{r..., c...\\}"

getCell=function(data,string){
  y=regmatches(string,gregexpr(pat,string,perl = T))
  data[do.call(rbind,lapply(y,as.numeric))]
}
pos<-regmatches(string,gregexpr(pat2,s))
unlist(pos)->pos # convert to character

getCell(table,pos)#Will give the values in (39,1),(40,1),(41,1),(42,1)

现在,我需要将结果重新放回原始公式s,以便使用eval(parse(text=s))进行评估

这可以与gsubfn一起使用,但我不能完全理解它。 b <- gsubfn(pat, getCell, s); b会导致Error in structure(.External(.C_dotTcl, ...), class = "tclObj") : [tcl] couldn't compile regular expression pattern: quantifier operand invalid.

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

在基数R中,我们可以使用regmatches来提取最后r之前c0之间的值。然后我们将变换为数字。这会自动降低前导零。然后我们使用它们从数据中提取所需的值

fun=function(data,x){
 y=regmatches(x,gregexpr("\\d+(?>\\d)\\B",x,perl = T))
 data[do.call(rbind,lapply(y,as.numeric))]
 }

pos=c("{r010, c070}","{r0200, c0700}","{r0990, c0990}")

fun(data,pos)#Will give you values in (1,7),(20,70),(99,99)