2017-02-16 5 views
1

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

Например, у меня есть набор данных, столбцы которой подобны

V1 <- c(1,2,3,4,5) 
V2 <- c(1,2,3,4,5) 
V3 <- c(1,2,3,4,5) 
V4 <- list(list("a","b","c"), 
     list("a","b","d"), 
     list("b","c","d"), 
     list("a","b","e"), 
     list("b","c","e")) 
V5 <- c(1,2,3,4,5) 
sample<-NA 
sample <- data.frame(V1,V2,V3,I(V4),V5) 

В этом, v4 содержит столбец списков

После разделения списка, желаемый кадр данных должен быть, как показано ниже

> sample 
    V1 V2 V3  V4 V5 V6 V7 V8 V9 V10 
1 1 1 1 a, b, c 1 1 1 1 0 0 
2 2 2 2 a, b, d 2 1 1 0 0 1 
3 3 3 3 b, c, d 3 0 1 1 1 0 
4 4 4 4 a, b, e 4 1 1 0 0 1 
5 5 5 5 b, c, e 5 0 1 1 0 1 

данные в новой переменной, созданной, должны быть 1 или 0, если они доступны в соответствующем списке.

Вот мой подход к тому, чтобы сделать то же самое. Сначала я определил все уникальные элементы списка и создал соответствующие столбцы с NA, а затем попытался проверить, есть ли конкретная переменная в списке, тогда ему назначается 1 else 0.

features <- c("a","b","c","d","e") 
l <-1 
for(j in 1:length(sample$V4)){ 
    for(k in 6:10){ 
    for(i in features){ 
     if(i %in% tolower(unlist(sample$V4[[j]]))){ 
     sample[j,k] <-1 
     print(sample[j,k]) 
     }else{ 
     sample[j,k] <-0 
     } 
     print(c(l,k,i,j)) 
     l <- l+1 

    } 
    } 

} 

Я не знаю, где это происходит неправильно, это дает результат, как показано ниже

> sample 
    V1 V2 V3  V4 V5 V6 V7 V8 V9 V10 
1 1 1 1 a, b, c 1 0 0 0 0 0 
2 2 2 2 a, b, d 2 0 0 0 0 0 
3 3 3 3 b, c, d 3 0 0 0 0 0 
4 4 4 4 a, b, e 4 1 1 1 1 1 
5 5 5 5 b, c, e 5 1 1 1 1 1 
+2

Пожалуйста, покажите небольшой воспроизводимый пример и ожидаемый результат для других, чтобы отладить вашу проблему. – akrun

+0

@akrun Спасибо! отредактированный с помощью воспроизводимого кода. –

+0

Неясно, как вы получили эти значения 1 в ожидаемом выходе, когда элементы отсутствуют. Например, 'b, c, e 5 0 0 0 1 1' – akrun

ответ

2

Мы можем использовать mtabulate из qdapTools

library(qdapTools) 
sample[paste0("V", 6:10)] <- mtabulate(sample$V4) 
+1

Perfect !! Большое вам спасибо –

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

  • Нет связанных вопросов^_^