2016-12-06 2 views
0

Я пытаюсь сгладить вектор, содержащий несколько списков. Какой был бы лучший способ сделать это, сохранив данные, связанные с этим списком? Я пробовал использовать список, но это дало мне список, который не был связан с моими данными.Свертывание вектора, содержащего списки в R

## My data set looks something like this: 
df <- data.frame(A = c(1,2,3), 
       B = c(3,5,4), 
       C = c(4,3,5), 
       D = c(7,9,2)) 
df$E <- list(c(5, 3, 2, 1), 5, c(5, 2, 1)) 
df 
## A B C D   E 
## 1 1 3 4 7 5, 3, 2, 1 
## 2 2 5 3 9   5 
## 3 3 4 5 2 5, 2, 1 

## Ideally I would like it to look like this: 
A B C D E 
1 1 3 4 7 5 
2 1 3 4 7 3 
3 1 3 4 7 2 
4 1 3 4 7 1 
5 2 5 3 9 5 
6 3 4 5 2 5, 
7 3 4 5 2 5 
8 3 4 5 2 2 
9 3 4 5 2 1 

Есть ли простой способ сделать это?

+2

'tidyr :: unnest' –

+0

Особенно подобные вопросы, вы хотите, чтобы дать воспроизводимый пример, а не просто представление того, как выглядит объект. Некоторые рекомендации: http://stackoverflow.com/a/28481250/ – Frank

+0

В базе R: 'data.frame (df [rep (1: nrow (df), lengths (df $ E)), 1: 4], E = unlist (df $ E), row.names = NULL) ' – Jaap

ответ

2

Очень простой. Предположим, что ваш фрейм данных называется df.

library(tidyr) 
df %>% unnest(E) 

данных:

structure(list(A = 1:3, B = c(3L, 5L, 4L), C = c(4L, 3L, 5L), 
D = c(7L, 9L, 2L), E = list(c(5, 3, 2, 1), 5, c(5, 2, 1))), .Names = c("A", 
"B", "C", "D", "E"), row.names = c(NA, -3L), class = "data.frame") 
1

Наверное, не самый короткий путь об этом, но это будет получить результаты, которые вы хотите, не полагаясь на дополнительную библиотеку.

Во-первых, чтобы определить набор данных себя, как вы описали

testdata<-t(matrix(list(1,3,4,7,c(5,3,2,1), 
         2,5,3,9,5, 
         3,4,5,2,c(5,2,1) 
        ),nrow=5)) 

colnames(testdata)<-c("A","B","C","D","E") 

rownames(testdata)<-c(1,2,3) 

testdata выглядит следующим образом, где Numeric,4 является c(5,3,2,1) и Numeric,3 является c(5,2,1)

A B C D E   
1 1 3 4 7 Numeric,4 
2 2 5 3 9 5   
3 3 4 5 2 Numeric,3 

функция expandall является излишним, но помогает разбить код на более читаемые куски.

expandall<-function(x){ 
    do.call(cbind,x) 
} 

result<-apply(testdata,1,expandall) 
if(is.list(result)){ ## if there are sub arrays then apply will return 
        ## a list 
    result<-do.call(rbind,result) 
} 

применение expandall для каждой строки данных и связывание результатов мы получаем

 A B C D E 
[1,] 1 3 4 7 5 
[2,] 1 3 4 7 3 
[3,] 1 3 4 7 2 
[4,] 1 3 4 7 1 
[5,] 2 5 3 9 5 
[6,] 3 4 5 2 5 
[7,] 3 4 5 2 2 
[8,] 3 4 5 2 1 
Смежные вопросы