我在R中有一个带有标签的大清单。例如:
[[1]]
[1] "A" "C" "E" "F"
[[2]]
[1] "B" "C" "G"
[[3]]
[1] "A"
[[4]]
[1] "B"
[[5]]
[1] "C" "E"
[[6]]
[1] "G"
我需要构建一个包含两个值的表:1 /( - 1),表示行是否有标记(1)或不是(-1)。
"A" "B" "C" "E" "F" "G"
[1] 1 -1 -1 1 1 -1
[2] -1 1 1 -1 -1 1
[3] 1 -1 -1 -1 -1 -1
[4] -1 1 -1 -1 -1 -1
[5] -1 -1 1 1 -1 -1
[6] -1 -1 -1 -1 -1 1
答案 0 :(得分:7)
这是一种适合你的方法。
首先,我们将列表命名为(否则我们不能使用stack
):
names(dat) <- 1:length(dat)
然后我们把它变成长:
dat2 <- stack(dat)
让我们的桌子变得简单:
res <- with(dat2, table(ind, values))
res[res==0]<--1
>res
values
ind A B C E F G
1 1 -1 1 1 1 -1
2 -1 1 1 -1 -1 1
3 1 -1 -1 -1 -1 -1
4 -1 1 -1 -1 -1 -1
5 -1 -1 1 1 -1 -1
6 -1 -1 -1 -1 -1 1
使用的数据:
dat <- list(c("A","C","E","F"),c("B","C","G"),"A","B",c("C","E"),"G")
答案 1 :(得分:5)
我们可以使用mtabulate
library(qdapTools)
d1 <- mtabulate(l1)
d1[d1==0] <- -1
d1
# A B C E F G
#1 1 -1 1 1 1 -1
#2 -1 1 1 -1 -1 1
#3 1 -1 -1 -1 -1 -1
#4 -1 1 -1 -1 -1 -1
#5 -1 -1 1 1 -1 -1
#6 -1 -1 -1 -1 -1 1
l1 <- list(c("A", "C", "E", "F"), c("B", "C", "G"), "A", "B",
c("C", "E"), "G")