#r #binary #matching
#r #двоичный #сопоставление
Вопрос:
Я хотел бы создать так называемый вектор соответствия, состоящий из двоичных файлов. Все числа должны быть равны нулю, если элементы не принадлежат одной и той же переменной.
Вот пример:
dataset=("a","b","c","d","x","y","z")
var1=c("a","b","y","z")
var2=c("c","d","x")
Таким образом, у меня есть набор данных со всеми переменными в первой строке. Теперь я создаю две группы: var1 и var2.
Соответствующий вектор для элемента «a» должен выглядеть как:
matching_a=c(1,1,0,0,0,1,1)
Числа соответствуют моему набору данных. Если переменные в моем наборе данных находятся в одной группе, в моем соответствующем векторе должно быть 1, а в противном случае 0.
Однако мой фактический набор данных слишком велик, чтобы сделать это вручную. Кто-нибудь понимает, что я хочу сделать?
Ответ №1:
Используя ifelse
функцию и %in%
оператор.
matching_a <- ifelse(dataset %in% var1, 1, 0)
matching_a
# [1] 1 1 0 0 0 1 1
Ответ №2:
> output1 = 1 * dataset %in% var1
> output2 = 1 * dataset %in% var2
> output1
[1] 1 1 0 0 0 1 1
> output2
[1] 0 0 1 1 1 0 0
Кроме того, если вам нужно сделать гораздо больше совпадений, чем var1
и var2
, будет полезно расширить это до чего-то вроде:
> vars = list(var1, var2)
> 1 * sapply(vars, function(x) dataset %in% x)
[,1] [,2]
[1,] 1 0
[2,] 1 0
[3,] 0 1
[4,] 0 1
[5,] 0 1
[6,] 1 0
[7,] 1 0
Ответ №3:
Я вижу, что Джон Колби уже выбрал путь, который я собирался предложить, но подумал, что я бы сделал его более явным.
Двоичная функция %in%
возвращает логический вектор и при умножении на 1 переводится в «числовой» режим. Это также можно сделать с:
matching_a <- as.numeric(dataset %in% x) # Or
matching_a <- 0 (dataset %in% x)
Вы также должны посмотреть, ?match
на чем %in%
основана функция.
Ответ №4:
Я использовал небольшое изменение подхода Джона выше (и решение Макса), чтобы сгенерировать список «двоичных векторов» (для нескольких совпадений) следующим образом:
library("plyr")
dataset<-c("a","b","c","d","x","y","z")
var1<-c("a","b","y","z")
var2<-c("c","d","x")
vars <- list(var1, var2)
binaryLst <- lapply(vars ,function(x){ifelse(dataset %in% x, 1, 0)})
вывод:
> binaryLst
[[1]]
[1] 1 1 0 0 0 1 1
[[2]]
[1] 0 0 1 1 1 0 0