Использование gsub для разделения 1 и 11 от Q1 и Q1Q1 до Q1 и Q2 - PullRequest
0 голосов
/ 01 июня 2018

Я пытаюсь объединить вектор 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)

Я хочу, чтобы любой из 2 * 6 или 6 * 11 был добавлен квектор z для любого случая z, потому что согласно вектору xy есть взаимодействия между 2,6,11 в соответствии с вектором z

      xy=paste0(x,"*",y,collapse=",")
      xy
    # [1] #"1*1,1*2,1*3,1*5,1*6,1*8,1*18,2*1,2*2,2*5,2*6,2*7,3*8,3*12,3*15,4*16,6*11,6*17,#9*18,10*19,16*20,21*21"
     z<-c(1,6,11)
     z
    #[1]  1  6 11

Я хочу, чтобы четвертый вектор имел все взаимодействия z из вектора xy и в сочетаниив новый вектор xyz

     xyz<-print("1+6+11+1*6+6*11")
    #[1] "1+6+11+1*6+6*11"
     xyz
    #[1] "1+6+11+2*6+2*11+6*11"

, затем для каждого жизнеспособного 1,6,11 конвертируем в Q1, Q2, Q3. Таким образом, конечный продукт выглядит как ...

     xyz<-print("Q1+Q2+Q3+Q1*Q2+Q2*Q3")
    #[1]
  #End result:
 #"Q1+Q2+Q3+Q1*Q2+Q2*Q3"

У меня естьэтот ответДля функции gsub я не могу заставить ее зарегистрировать 1 и 11 отдельно.Это продолжается для Q1 и Q1Q1.

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)

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Я думаю, вы можете полностью пропустить циклы 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 = '+'))

, что дает:

> 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)
0 голосов
/ 01 июня 2018

Вы должны использовать граничное условие в вашем gsub, как показано ниже:

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

Граничное условие поможет регулярному выражению различать значения от 1 до 11. В противном случае, оно представляет собой пример11 (одиннадцать) как два экземпляра 1 и 1.

Вывод:

> print(xyz)
[1] "y~Q1+Q2+Q3+Q1*Q2+Q2*Q3"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...