从r中的多个列表生成二进制(存在/不存在)数据矩阵

从r中的多个列表生成二进制(存在/不存在)数据矩阵,r,dataframe,matrix,binary,heatmap,R,Dataframe,Matrix,Binary,Heatmap,我有一系列不同长度的独立变量列表(字符串)。我想将它们合并到一个数据帧中,以形成存在(1)/不存在(0)矩阵。考虑到它们的长度不同,我甚至不知道如何创建初始数据帧。以下是我的例子: data1 <- c("a", "b", "c", "d", "e", "f") data2 <- c("e", "f", "g") data3 <- c("a", "c", "g") 我还是新手,希望我的解释可以。谢谢您的帮助。在splitstackshape包中有一个名为charMat的帮助函

我有一系列不同长度的独立变量列表(字符串)。我想将它们合并到一个数据帧中,以形成存在(1)/不存在(0)矩阵。考虑到它们的长度不同,我甚至不知道如何创建初始数据帧。以下是我的例子:

data1 <- c("a", "b", "c", "d", "e", "f")
data2 <- c("e", "f", "g")
data3 <- c("a", "c", "g")

我还是新手,希望我的解释可以。谢谢您的帮助。

splitstackshape
包中有一个名为
charMat
的帮助函数,您可能想尝试一下

dat <- paste0("data", 1:3)
out <- t(splitstackshape:::charMat(listOfValues = mget(dat), fill = 0L))
colnames(out) <- dat
out
#  data1 data2 data3
#a     1     0     1
#b     1     0     0
#c     1     0     1
#d     1     0     0
#e     1     1     0
#f     1     1     0
#g     0     1     1
其中,
dat
是包含输入数据名称的字符向量

dat
#[1] "data1" "data2" "data3"
t
用于转置
charMat
的输出


希望这有帮助。

我会这样做,使用%中的
%返回一个逻辑向量,如果有值或没有值。稍后,我们使用
as.integer
将逻辑值转换为0和1

# create a master list
master_list <- unique(c(data1, data2, data3))

# make sure each list is as long as master to avoid,
# this error : longer object length is not a multiple of shorter object length
# adding 'll' just a random value
data1 <- c(data1, rep('ll', length(master_list) - length(data1)))
data2 <- c(data2, rep('ll', length(master_list) - length(data2)))
data3 <- c(data3, rep('ll', length(master_list) - length(data3)))

# create output matrix
mat <- matrix(c(as.integer(master_list %in% data1),
            as.integer(master_list %in% data2),
            as.integer(master_list %in% data3)),
            nrow = length(master_list), 
            dimnames = list(master_list))

  [,1] [,2] [,3]
a    1    0    1
b    1    0    0
c    1    0    1
d    1    0    0
e    1    1    0
f    1    1    0
g    0    1    1
#创建主列表

师父,谢谢。我无法让它工作,因为它创建了一个包含一列和行数data1+data2+data3的矩阵。另外,这是一个示例,我有25个列表,所以手工编码每个列表似乎不是一个理想的解决方案。。
mget(dat)
#$data1
#[1] "a" "b" "c" "d" "e" "f"

#$data2
#[1] "e" "f" "g"

#$data3
#[1] "a" "c" "g"
dat
#[1] "data1" "data2" "data3"
# create a master list
master_list <- unique(c(data1, data2, data3))

# make sure each list is as long as master to avoid,
# this error : longer object length is not a multiple of shorter object length
# adding 'll' just a random value
data1 <- c(data1, rep('ll', length(master_list) - length(data1)))
data2 <- c(data2, rep('ll', length(master_list) - length(data2)))
data3 <- c(data3, rep('ll', length(master_list) - length(data3)))

# create output matrix
mat <- matrix(c(as.integer(master_list %in% data1),
            as.integer(master_list %in% data2),
            as.integer(master_list %in% data3)),
            nrow = length(master_list), 
            dimnames = list(master_list))

  [,1] [,2] [,3]
a    1    0    1
b    1    0    0
c    1    0    1
d    1    0    0
e    1    1    0
f    1    1    0
g    0    1    1