首页 > 解决方案 > 将字符串转换为唯一的整数形式

问题描述

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

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 形式转换为字符串的能力

这样的转换可能吗?

标签: rstringintegertransform

解决方案


如果所有规则都与您显示的规则相似,一种方法是生成一个标准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 包于 2021-08-29 创建 (v2.0.0 )


推荐阅读