我在一个由8位掩码组成的数据帧中有一列。我想在我的数据框架中把这个“爆炸”成8个新列。位掩码定义为:
mask <- c('term1'=1,'term2'=2,'term3'=4,'term4'=8,...) #etc
最后,我希望在我的数据named中有8个新列,名为term1 (通过term8 ),其值为TRUE/FALSE,并注明是否设置了位。例如,使用3位掩码:
id bitmask
a 1
b 4
c 5
就会来:
id bitmask term1 term2 term3
a 1 TRUE FALSE FALSE
b 4 FALSE FALSE TRUE
c 5 TRUE FALSE TRUE
我已经编写了创建位掩码列值的函数:
addl <- as.data.frame(sapply(data$bitmask, function(x) bitwAnd(x,mask) > 0))
但是我显然做错了什么,因为当我试图使用head(addl)看到结果时,它只是挂起。我甚至还没有达到cbind()或设置列名的程度。任何帮助理解我做错了什么,我们将非常感激!
发布于 2015-09-30 17:12:31
在基数R中,设置数据:
mask <- c('term1'=1,'term2'=2,'term3'=4)
df <- data.frame(id = c(letters[1:3]), bitmask = c(1,4,5))
cbind(df, sapply(mask, bitwAnd, df$bitmask) > 0)
# id bitmask term1 term2 term3
# 1 a 1 TRUE FALSE FALSE
# 2 b 4 FALSE FALSE TRUE
# 3 c 5 TRUE FALSE TRUE
或者使用data.table
可以做到:
require(data.table)
dt <- as.data.frame(df)
data.table(dt, dt[,sapply(mask, bitwAnd, bitmask)] > 0)
# id bitmask term1 term2 term3
# 1: a 1 TRUE FALSE FALSE
# 2: b 4 FALSE FALSE TRUE
# 3: c 5 TRUE FALSE TRUE
发布于 2015-09-30 17:57:00
R基地:
mask <- c('term1'=1,'term2'=2,'term3'=4,'term4'=8)
dat <- data.frame(id=letters[1:3], bitmask=c(1, 4, 5), stringsAsFactors=FALSE)
cbind(dat, do.call(rbind, lapply(dat$bitmask, function(x) {
setNames(rbind.data.frame(bitwAnd(x, mask)>0), names(mask))
})))
## id bitmask term1 term2 term3 term4
## 1 a 1 TRUE FALSE FALSE FALSE
## 2 b 4 FALSE FALSE TRUE FALSE
## 3 c 5 TRUE FALSE TRUE FALSE
但盖瑞最新的答案要好得多。
https://stackoverflow.com/questions/32877693
复制