R 使用gsub将1和11从Q1和Q1分离到Q1和Q2

R 使用gsub将1和11从Q1和Q1分离到Q1和Q2,r,R,我正试图根据xy中的相互作用项和z中的相互作用项合并xy向量和z向量。然后将最终代码更改为Q1,Q2…Q1*Q2。我在使用时遇到问题 我有两个向量需要匹配为向量xy: x<-c(1,1,1,1,1,1,1,2,2,2,2,2,3,3,3,4,6,6,9,10,16,21) y<-c(1,2,3,5,6,8,18,1,2,5,6,7,8,12,15,16,11,17,18,19,20,21) x您应该在gsub中使用边界条件,如下所示: xyz <- gsub(paste0(

我正试图根据xy中的相互作用项和z中的相互作用项合并xy向量和z向量。然后将最终代码更改为Q1,Q2…Q1*Q2。我在使用时遇到问题

我有两个向量需要匹配为向量xy:

x<-c(1,1,1,1,1,1,1,2,2,2,2,2,3,3,3,4,6,6,9,10,16,21)
y<-c(1,2,3,5,6,8,18,1,2,5,6,7,8,12,15,16,11,17,18,19,20,21)

x您应该在
gsub
中使用边界条件,如下所示:

 xyz <- gsub(paste0("\\b",z[i],"\\b"),z_map[i], xyz)

我想你可以完全跳过for循环。完整问题的可能解决方案:

i <- x %in% z & y %in% z & x != y

q <- paste0('Q',1:4)

x1 <- q[match(x[i], z)]
y1 <- q[match(y[i], z)]

xyz <- paste0('y~',
              paste0(c(union(x1, y1), paste(x1, y1, sep = '*')),
                     collapse = '+'))

使用数据:

x <- c(1,1,1,1,1,1,1,2,2,2,2,2,3,3,3,4,6,6,9,10,16,21)
y <- c(1,2,3,5,6,8,18,1,2,5,6,7,8,12,15,16,11,17,18,19,20,21)
z <- c(1,6,11)
x
xyz <- as.character(z)

for(i in 1:length(x)){
  if(x[i] %in% z & y[i] %in% z x[i] != y[i]){
    xyz <- c(xyz, (paste0(x[i], "*", y[i])))
  }
}
print(xyz)
xyz <- paste0(xyz, collapse = "+")
print(xyz)

z_map <- c("Q1","Q2","Q3","Q4")
for(i in 1:length(z)){
  xyz <- gsub(z[i],z_map[i], xyz)
  }
xyz<-paste0('y~',xyz)
print(xyz)
 xyz <- gsub(paste0("\\b",z[i],"\\b"),z_map[i], xyz)
> print(xyz)
[1] "y~Q1+Q2+Q3+Q1*Q2+Q2*Q3"
i <- x %in% z & y %in% z & x != y

q <- paste0('Q',1:4)

x1 <- q[match(x[i], z)]
y1 <- q[match(y[i], z)]

xyz <- paste0('y~',
              paste0(c(union(x1, y1), paste(x1, y1, sep = '*')),
                     collapse = '+'))
> xyz
[1] "y~Q1+Q2+Q3+Q1*Q2+Q2*Q3"
x <- c(1,1,1,1,1,1,1,2,2,2,2,2,3,3,3,4,6,6,9,10,16,21)
y <- c(1,2,3,5,6,8,18,1,2,5,6,7,8,12,15,16,11,17,18,19,20,21)
z <- c(1,6,11)