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