将字符串转换为唯一的整数形式

convert string to unique integer form

我有一个字符串向量,在我的例子中,字符串是逻辑规则。 有很多这样的规则,但为了清楚起见,我只显示了三个。

rules <- c("X[,1]>0.5 & X[,2]<1" , "X[,3]>0.2" , "X[,3]>0.3")

我想将规则转换为整数形式,类似那样

rules <- c("X[,1]>0.5 & X[,2]<1" , "X[,3]>0.2" , "X[,3]>0.3")
int <- rbind(c(0,0,2,5,0,1,0,0,1,0),c(1,2,0,0,0,0,0,0,0,0),c(1,1,0,0,0,0,0,0,0,0))

.

cbind.data.frame(rules,int)
                rules 1 2 3 4 5 6 7 8 9 10
1 X[,1]>0.5 & X[,2]<1 0 0 2 5 0 1 0 0 1  0
2           X[,3]>0.2 1 2 0 0 0 0 0 0 0  0
3           X[,3]>0.3 1 1 0 0 0 0 0 0 0  0

三个条件

  1. 所有int向量的长度必须相同

  2. 如果规则(字符串)与另一个字符串相似,那么int向量也应该相似。这是必要的,以便能够计算字符串或 int 向量之间的距离。

  3. 能够将字符串转换为 int 形式,以及将 int 形式转换回字符串

这样的转换是否可行?

如果所有规则都与您展示的相似,一种方法是生成标准 X 矩阵,解析每个规则并将它们应用于 X。这将生成向量TRUE 和 FALSE(很容易转换为 1 和 0),长度为 nrow(X).

例如,

set.seed(123)
X <- matrix(runif(3000, 0, 2), nrow = 1000)
rules <- c("X[,1]>0.5 & X[,2]<1" , "X[,3]>0.2" , "X[,3]>0.3")
int <- matrix(NA, nrow = length(rules), ncol = nrow(X))
for (i in seq_along(rules)) 
  int[i,] <- as.numeric(eval(parse(text = rules[i])))
rownames(int) <- rules

dist <- matrix(NA, length(rules), length(rules),
               dimnames = list(rules, rules))
for (i in seq_along(rules)) 
  for (j in seq_along(rules)) 
    dist[i, j] <- sqrt(sum((int[i,] - int[j,])^2))

dist
#>                     X[,1]>0.5 & X[,2]<1 X[,3]>0.2 X[,3]>0.3
#> X[,1]>0.5 & X[,2]<1             0.00000  24.67793  24.28992
#> X[,3]>0.2                      24.67793   0.00000   7.28011
#> X[,3]>0.3                      24.28992   7.28011   0.00000

reprex package (v2.0.0)

于 2021-08-29 创建