首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何从数据帧中的列和cbind()创建多列到dataframe

如何从数据帧中的列和cbind()创建多列到dataframe
EN

Stack Overflow用户
提问于 2015-10-01 00:28:11
回答 2查看 975关注 0票数 1

我在一个由8位掩码组成的数据帧中有一列。我想在我的数据框架中把这个“爆炸”成8个新列。位掩码定义为:

代码语言:javascript
代码运行次数:0
运行
复制
mask <- c('term1'=1,'term2'=2,'term3'=4,'term4'=8,...) #etc

最后,我希望在我的数据named中有8个新列,名为term1 (通过term8 ),其值为TRUE/FALSE,并注明是否设置了位。例如,使用3位掩码:

代码语言:javascript
代码运行次数:0
运行
复制
id   bitmask
 a         1
 b         4
 c         5

就会来:

代码语言:javascript
代码运行次数:0
运行
复制
id   bitmask   term1   term2   term3
 a         1    TRUE   FALSE   FALSE
 b         4   FALSE   FALSE    TRUE
 c         5    TRUE    FALSE    TRUE

我已经编写了创建位掩码列值的函数:

代码语言:javascript
代码运行次数:0
运行
复制
addl <- as.data.frame(sapply(data$bitmask, function(x) bitwAnd(x,mask) > 0))

但是我显然做错了什么,因为当我试图使用head(addl)看到结果时,它只是挂起。我甚至还没有达到cbind()或设置列名的程度。任何帮助理解我做错了什么,我们将非常感激!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-01 01:12:31

在基数R中,设置数据:

代码语言:javascript
代码运行次数:0
运行
复制
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可以做到:

代码语言:javascript
代码运行次数:0
运行
复制
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
票数 3
EN

Stack Overflow用户

发布于 2015-10-01 01:57:00

R基地:

代码语言:javascript
代码运行次数:0
运行
复制
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

但盖瑞最新的答案要好得多。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32877693

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档