R 使用值标志生成矩阵

R 使用值标志生成矩阵,r,R,我确实有一个解决以下问题的方法,但它非常难看,而且很可能用更短的方式来完成。能得到你的帮助就太好了 我的输入如下所示: C1 C2 A B B D D C A D A B C D 1 1 0 0 0 1 0 1 0 0 1 1 1 0 0 1 我的输出应该如下所示: C1 C2 A B B D D C A D A B C D 1 1 0 0 0 1

我确实有一个解决以下问题的方法,但它非常难看,而且很可能用更短的方式来完成。能得到你的帮助就太好了

我的输入如下所示:

C1     C2 
A      B     
B      D    
D      C 
A      D
A B C D
1 1 0 0
0 1 0 1
0 0 1 1  
1 0 0 1
我的输出应该如下所示:

C1     C2 
A      B     
B      D    
D      C 
A      D
A B C D
1 1 0 0
0 1 0 1
0 0 1 1  
1 0 0 1
我目前的解决办法是:

index <- unique(unlist(input[,1:2]))
output <- matrix(0,nrows=dim(input),ncols=length(index))
for(i in 1:dim(input)) {
    output[i, input[i,]$C1] <- 1
    output[i, input[i,]$C2] <- 1
}
索引这里有一种方法:

library(plyr)
all.levels <- sort(levels(unlist(input)))
adply(input, 1, function(x)table(factor(unlist(x), all.levels)))
#   C1 C2 A B C D
# 1  A  B 1 1 0 0
# 2  B  D 0 1 0 1
# 3  D  C 0 0 1 1
# 4  A  D 1 0 0 1
库(plyr)
所有级别这里有一种方法:

library(plyr)
all.levels <- sort(levels(unlist(input)))
adply(input, 1, function(x)table(factor(unlist(x), all.levels)))
#   C1 C2 A B C D
# 1  A  B 1 1 0 0
# 2  B  D 0 1 0 1
# 3  D  C 0 0 1 1
# 4  A  D 1 0 0 1
库(plyr)

所有.levels我认为您可以通过
重塑
包中的
cast
来实现这一点。我现在无法测试代码(我的R版本太旧,目前正在重新编译)

这将实际计算每对出现的次数,以改变此行为,使用常量函数替换
sum
(可能有一种更漂亮的方法,不需要cbind/sum,但我的R已经生锈了)


编辑:添加了add.missing

我认为您可以使用
重塑
包中的
强制转换
来完成此操作。我现在无法测试代码(我的R版本太旧,目前正在重新编译)

这将实际计算每对出现的次数,以改变此行为,使用常量函数替换
sum
(可能有一种更漂亮的方法,不需要cbind/sum,但我的R已经生锈了)

编辑:添加。缺少基本解决方案:

test <- data.frame( C1=c("A","B","D","A"),
                C2=c("B","D","C","D"),
                stringsAsFactors=FALSE
            )

uniqnames <- sort(unique(unlist(test[,1:2])))
idcols <- (t(apply(test, 1 , '%in%', x = uniqnames)) + 0) #thanks mnel!
colnames(idcols) <- uniqnames

result <- cbind(
    test,
    idcols
    )
基本解决方案:

test <- data.frame( C1=c("A","B","D","A"),
                C2=c("B","D","C","D"),
                stringsAsFactors=FALSE
            )

uniqnames <- sort(unique(unlist(test[,1:2])))
idcols <- (t(apply(test, 1 , '%in%', x = uniqnames)) + 0) #thanks mnel!
colnames(idcols) <- uniqnames

result <- cbind(
    test,
    idcols
    )

@mnel-尼斯皮卡,将编辑此行的答案,因为它更简单。@mnel-尼斯皮卡,将编辑此行的答案,因为它更简单。