Как создать двоичный вектор с 1, если элементы являются частью одного вектора? - PullRequest
7 голосов
/ 05 ноября 2011

Я хотел бы создать так называемый совпадающий вектор, состоящий из двоичных файлов. Все числа должны быть нулевыми, если элементы не принадлежат одной и той же переменной.

Вот пример:

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 в противном случае.

Однако мой фактический набор данных слишком велик, чтобы делать это вручную. Кто-нибудь понимает, что я хочу сделать?

Ответы [ 4 ]

5 голосов
/ 05 ноября 2011
> 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
5 голосов
/ 05 ноября 2011

Использование функции ifelse и оператора %in%.

matching_a <-  ifelse(dataset %in% var1, 1, 0)

matching_a
# [1] 1 1 0 0 0 1 1
3 голосов
/ 05 ноября 2011

Я вижу, что Джон Колби уже пошел по пути, который я собирался предложить, но подумал, что сделаю его более явным.

Двоичная функция %in% возвращает логический вектор и умножение на 1 приводит к режиму "числовой" . Это также можно сделать с помощью:

matching_a <- as.numeric(dataset %in% x) # Or

matching_a <- 0 + (dataset %in% x)

Вам также следует взглянуть на ?match, на котором основана функция %in%.

0 голосов
/ 31 марта 2018

Я использовал небольшое изменение подхода Джона, описанного выше (и решения Макса), чтобы сгенерировать список «двоичных векторов» (для нескольких совпадений) следующим образом:

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)})

output:

> binaryLst
[[1]]
[1] 1 1 0 0 0 1 1

[[2]]
[1] 0 0 1 1 1 0 0
...