Найти первое совпадение со столбцом 1 в столбцах 2: 4 - R - PullRequest
0 голосов
/ 05 ноября 2018

Сравнивая "x1", "x2", "x3" с "target", как мне вернуть первый индекс столбца, который соответствует "target"? АН не может привести ни к какому совпадению.

pop <- c("A", "B", "C", "D")
target <- pop
x1 <- sample(pop)
x2 <- sample(pop)
x3 <- sample(pop)
df <- data.frame(target,x1,x2,x3)

> df
  target x1 x2 x3
1      A  B  B  D
2      B  D  C  C
3      C  C  A  A
4      D  A  D  B

Я пытался использовать что-то вроде:

min(which(df[3, 1] == df[3, 2:ncol(df)]))

... (строка 3 используется в качестве примера), но я не знаю, как изящно обрабатывать случаи, когда нет совпадений, поэтому, вероятно, у меня возникают проблемы при использовании этого в функции с apply () , Цель - либо новый столбец на df, либо вектор возвращаемых значений.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Вот решение с использованием match -

> df
  target x1 x2 x3
1      A  C  A  C
2      B  A  B  B
3      C  D  D  D
4      D  B  C  A

apply(df, 1, function(x) match(TRUE, x[-1] == x[1]))

[1]  2  2 NA NA

Данные -

df <- structure(list(target = c("A", "B", "C", "D"), x1 = c("C", "A", 
"D", "B"), x2 = c("A", "B", "D", "C"), x3 = c("C", "B", "D", 
"A")), .Names = c("target", "x1", "x2", "x3"), row.names = c(NA, 
-4L), class = "data.frame")
0 голосов
/ 05 ноября 2018

Есть много способов сделать это. Переберите столбцы 2: 4, сравните с target и получите индекс первого совпадения с which

sapply(df[-1], function(x) which(x == df$target)[1])
 x1 x2 x3 
#1  3 NA 

Если это для сравнения строк

m1 <-  df$target == df[-1]
max.col(m1, 'first') *  NA^!rowSums(m1)

Или

apply(m1, 1, function(x) which(x)[1])

данные

df <- data.frame(target,x1,x2,x3, stringsAsFactors = FALSE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...