Перебирайте строки, ищите совпадающие символы с совпадающими индексами, и если это так: вставьте '1' в другой столбец - R - PullRequest
0 голосов
/ 16 апреля 2020

Я хочу l oop через 'standard' & 'superficial.match' и получить два бита дополнительных данных:

1) имеет ли «standard» символ с одинаковым значением и одинаковым индексировать как символ в 'superficial.match' ('mips' = совпадение на месте)

2) сколько символов в «стандартном» соответствует символам в «superficial.match» («two.match»)

например:

в строке 1, на третьем месте совпадающие 4, а в 'стандартных' есть две 4, поэтому 'mips' и '2match' должны = True или 1

в строке 6, 4 совпадения на месте, но есть только 1 совпадение, поэтому 'mips' = True и 'two.match' = False

> head.matrix(masterdata[c(5,6,14,15)], n=6)
  standard superficial.match mips two.match
1      464               584    0      0
2      575               159    0      0
3      686               896    0      0
4      131               971    0      0
5      818               348    0      0
6      242               348    0      0

строка 3 кажется иметь 1 символ, который соответствует на месте, и 1, который не соответствует, это должно быть 'NA' для 'mips'

1 Ответ

0 голосов
/ 16 апреля 2020

Если вы разделите каждое из полей standard и superficial.match, чтобы получить векторы их компонентных символов, вы можете сравнить каждую пару с обычным оператором ==.

Я предполагаю, что эти поля являются строками, а не числами c.

Эта функция выполняет разбиение, проверяет, больше ли число мест, в которых найдено совпадение, больше 0, а затем, для каждого совпадающего символа, проверяет, сколько раз это происходит в столбце standard для возврата логического значения, если число совпадений> = 2.

fn <- function(x) {
  x1 <- unlist(strsplit(x[1], ''))
  x2 <- unlist(strsplit(x[2], ''))
  cmp <- x1 == x2
  mips <- sum(cmp) > 0
  if (mips) {
    two.match <- max(rowSums(outer(x1[cmp], x1, FUN = '=='))) >= 2  
  } else {
    two.match <- FALSE
  }

  c(mips = mips, two.match = two.match)
}

Вы можете запустить его строка за строкой в ​​матрице x и транспонировать в попасть в столбчатый формат:

t(apply(x, 1, fn))
      mips two.match
[1,]  TRUE      TRUE
[2,] FALSE     FALSE
[3,]  TRUE      TRUE
[4,]  TRUE      TRUE
[5,]  TRUE      TRUE
[6,]  TRUE     FALSE
...