Разделить столбец массива данных на несколько двоичных столбцов [R] - PullRequest
1 голос
/ 31 октября 2019

Array column is current and the others are the goal

Текущий столбец массива, а остальные - цель

У меня есть столбец массивов, и я хотел бы разделить его на несколькодвоичные файлы. Я создал все столбцы с помощью

dat[,unique(unlist(df$array_column))] = 0

Я попытался использовать оператор ifelse, чтобы затем установить для столбцов значение «1», но с использованием %in% не работает с ifelse. Я мог бы создать вложенный цикл for, однако у меня есть миллионы строк, и я ищу более быстрое решение, чем это.

testdf = data.frame('a'=c(1,2,3,4,5),'array_column'=c('a-b-c','b-a','c-d','d-e-e','e-a'),stringsAsFactors = F)
testdf$array_column = strsplit(testdf$array_column,'-')

1 Ответ

1 голос
/ 31 октября 2019

Я думаю, что вопрос скорее в том, как преобразовать список векторов в двоичную матрицу / data.frame

Вот решение

testdf = data.frame('a'=c(1,2,3,4,5),'array_column'=c('a-b-c','b-a','c-d','d-e-e','e-a'),stringsAsFactors = F)                     
testdf$array_column = strsplit(testdf$array_column,'-')    

library('plyr')                                                                                                

# Creates a list of data.frames with 1s for each value observed                                                                   
binary <- lapply(testdf$array_column, function(x) {                                                                                                                                                   
                     vals <- unique(x) 
                     x <- setNames(rep(1,length(vals)), vals);                                                                      
                     do.call(data.frame, as.list(x))                                                                                
                })                                                                                                                  

# Joins into single data.frame                                                                                                                
result <- do.call(rbind.fill, binary)                                                                                                
result[is.na(result)] <- 0                                                                                                          

result                                                                                                                              
#   a b c d e                                                                                                                       
# 1 1 1 1 0 0                                                                                                                       
# 2 1 1 0 0 0                                                                                                                       
# 3 0 0 1 1 0                                                                                                                       
# 4 0 0 0 1 1                                                                                                                       
# 5 1 0 0 0 1  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...