将字符串转换为唯一的整数形式
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
三个条件
所有int
向量的长度必须相同
如果规则(字符串)与另一个字符串相似,那么int
向量也应该相似。这是必要的,以便能够计算字符串或 int
向量之间的距离。
能够将字符串转换为 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 创建
我有一个字符串向量,在我的例子中,字符串是逻辑规则。 有很多这样的规则,但为了清楚起见,我只显示了三个。
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
三个条件
所有
int
向量的长度必须相同如果规则(字符串)与另一个字符串相似,那么
int
向量也应该相似。这是必要的,以便能够计算字符串或int
向量之间的距离。能够将字符串转换为 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 创建