R 如何计算二进制模式

R 如何计算二进制模式,r,data.table,R,Data.table,这个问题有很多应用。我想在许多变量中识别和计算唯一的二进制模式。我找到了一些接近我所寻找的东西,但我无法完成代码 与链接中的数据相同: library(data.table) xx <- rbind(c(1,0,0),c(1,0,0),c(1,0,1),c(0,1,1),c(0,1,1)) xx <- as.data.table(xx) library(e1071) countpattern(xx[,1:3]) 000 001 010 011 100 101 110 111

这个问题有很多应用。我想在许多变量中识别和计算唯一的二进制模式。我找到了一些接近我所寻找的东西,但我无法完成代码

与链接中的数据相同:

library(data.table)
xx <- rbind(c(1,0,0),c(1,0,0),c(1,0,1),c(0,1,1),c(0,1,1))
xx <- as.data.table(xx)

library(e1071)
countpattern(xx[,1:3])
000 001 010 011 100 101 110 111 
  0   0   0   2   2   1   0   0 

(cols <- names(which(countpattern(xx[,1:3])>0)))
for(i in cols) { xx[,i] <- as.character("") }  # ... and that's it :(

xx
   V1 V2 V3 011 100 101
1:  1  0  0            
2:  1  0  0            
3:  1  0  1            
4:  0  1  1            
5:  0  1  1            
我已经为(我在seq_-along){set(DT,I,1L,I)}尝试了几个版本的fast
,但我的目标比我的技能更大

谢谢,
Aldo

这里有一种方法可以做到这一点

library(data.table)
#Paste all the binary columns together rowwise
vals <- do.call(paste0, xx)
#Get only unique values
unique_vals <- unique(vals)
#Initialise the columns to 0
xx[, (unique_vals) := 0]

#Create a matrix with row and column index and replace those position with 1
xx[cbind(seq_len(nrow(xx)), match(vals, unique_vals) + 3)] <- 1
#Replace 3 with number in original columns
xx
#   V1 V2 V3 100 101 011
#1:  1  0  0   1   0   0
#2:  1  0  0   1   0   0
#3:  1  0  1   0   1   0
#4:  0  1  1   0   0   1
#5:  0  1  1   0   0   1

天哪!太快了。我没想到。而且它有效@谢谢你!还使用
countpattern
函数更新了答案。感谢这两个答案,它们都有效。我更喜欢第一个,因为我不想依赖于
e1071
。如果你不介意的话,你能帮我理解两行吗:1)做什么。打电话做什么我可以看到最终的结果,但是
paste0(xx,collapse=“”)
粘贴的各种组合。。。任何
操作都不会产生与
do.call
相同的结果。我要通过
?打电话给
,但仍然。2)最后一行,我知道您正在将列绑定到
xx
,但我仍然不明白它为什么有效。另外,如果检查
do.call的输出,我是否可以用
+长度(唯一值)
替换
+3
?@504aldo 1)。它按行粘贴列的所有值。因此
do.call(paste0,xx)
apply(xx,1,paste0,collapse=“”)
2)我们已经绑定了前一行中的列(
(unique\u vals):=0
)。
匹配
用于获取需要分配1的列号。不,您不能将
+3
替换为
长度(唯一值)
,因为
长度(唯一值)
是要添加的新列数,
+3
是在添加新列之前数据帧中的原始列数,在这种情况下碰巧是相同的。感谢您帮助我理解<代码>应用(xx,1,paste0,collapse=“”)
-OMG我觉得很尴尬,我没有想到这一点。经过一些尝试和错误之后,我得到了一个额外的选择:
Reduce(paste0,xx)
,但是根据,Reduce
do.call
library(data.table)
#Paste all the binary columns together rowwise
vals <- do.call(paste0, xx)
#Get only unique values
unique_vals <- unique(vals)
#Initialise the columns to 0
xx[, (unique_vals) := 0]

#Create a matrix with row and column index and replace those position with 1
xx[cbind(seq_len(nrow(xx)), match(vals, unique_vals) + 3)] <- 1
#Replace 3 with number in original columns
xx
#   V1 V2 V3 100 101 011
#1:  1  0  0   1   0   0
#2:  1  0  0   1   0   0
#3:  1  0  1   0   1   0
#4:  0  1  1   0   0   1
#5:  0  1  1   0   0   1
library(e1071)

pat <- countpattern(xx, matching=TRUE)
xx[, (names(pat$pat)) := 0]
xx[cbind(seq_len(nrow(xx)), pat$matching + 3)] <- 1

xx
#   V1 V2 V3 000 001 010 011 100 101 110 111
#1:  1  0  0   0   0   0   0   1   0   0   0
#2:  1  0  0   0   0   0   0   1   0   0   0
#3:  1  0  1   0   0   0   0   0   1   0   0
#4:  0  1  1   0   0   0   1   0   0   0   0
#5:  0  1  1   0   0   0   1   0   0   0   0