R 使用gsub将1和11从Q1和Q1分离到Q1和Q2
我正试图根据xy中的相互作用项和z中的相互作用项合并xy向量和z向量。然后将最终代码更改为Q1,Q2…Q1*Q2。我在使用时遇到问题 我有两个向量需要匹配为向量xy: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(
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)