2015-10-01 2 views
1

У меня есть столбец в фрейме данных, состоящем из 8-битовой битовой маски. Я хочу «взорвать» это 8 новых столбцов в моем кадре данных. Битовый определяются как:Как создать несколько столбцов из столбца в кадре данных и cbind() в dataframe

mask <- c('term1'=1,'term2'=2,'term3'=4,'term4'=8,...) #etc 

к концу, я хочу 8 новых столбцов в моем dataframe имени 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() или не задал имена столбцов. Любая помощь, понимающая, что я делаю неправильно, будет очень признательна!

+0

попробуйте использовать ': =' для создания новых столбцов –

+0

Гэри, спасибо за предложение. Я немного глупо спрашиваю об этом, но я искал операторов в R, и я не видел: = нигде. ?: = из RStudio ничего не дало? –

+0

Это пакет 'data.table'. И я думаю, что лучше использовать '??": = "' для поиска этой функции (если 'data.table' уже установлен). –

ответ

3

В базовой 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 
+0

Я получаю 'битваАнд (5,2)> 0' является' FALSE' –

+0

Гэри, спасибо за вход для базы R. Я заметил, что база R довольно медленная. Является ли data.table значительно быстрее? Возможно, я слишком нерешительно отношусь к использованию относительно новых пакетов без имени Хэдли в конце. –

+0

@AlexanderDavid Первая версия 'data.table' появилась в апреле 2006 года. Неужели она еще недавно? –

2

Основание 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 

Но обновленный ответ Гэри это лучше ,

+1

Спасибо! К сожалению, я не могу установить какие-либо дополнительные пакеты в моем vdi, так что это берет торт. –

+0

Спасибо @hrbrmstr, я думаю, вы все равно выигрываете. 'do.call' также красив по-своему –

Смежные вопросы