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-尼斯皮卡,将编辑此行的答案,因为它更简单。