如果元素是同一向量的一部分,如何用1创建二进制向量?

时间:2011-11-05 16:44:18

标签: r binary matching

我想创建一个由二进制文件组成的所谓匹配向量。除非元素属于同一个变量,否则所有数字都应为零。

以下是一个例子:

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 个答案:

答案 0 :(得分:5)

使用ifelse函数和%in%运算符。

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

matching_a
# [1] 1 1 0 0 0 1 1

答案 1 :(得分:5)

> 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

此外,如果您要比var1var2提供更多匹配,那么将其扩展为以下内容会很有用:

> 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

答案 2 :(得分:3)

我看到约翰科尔比已经采取了我要提出的道路,但我想我会更清楚。

二元函数%in%返回一个逻辑向量,并乘以1强制为“numeric”模式。这也可以通过以下方式完成:

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

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

您还应该查看?match函数所基于的%in%

答案 3 :(得分:0)

我使用了John的上述方法(以及Max的解决方案)的略微变化来生成“二元向量”列表(用于多个匹配),如下所示:

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