2015-03-10 3 views
0

Я начал с этим кадром данных:Fix Рамка искореженных данных

sample.df <- as.data.frame(list(a=rnorm(10),b=letters[1:10],c=1:10)) 

> str(sample.df) 
'data.frame': 10 obs. of 3 variables: 
$ a: num -0.0407 0.5403 -1.2885 2.2196 -1.3411 ... 
$ b: Factor w/ 10 levels "a","b","c","d",..: 1 2 3 4 5 6 7 8 9 10 
$ c: int 1 2 3 4 5 6 7 8 9 10 

и я хранил его в MongoDB. Когда я восстановил его (в виде списка), это выглядело так:

list(structure(list(`_id` = "54fd400dc37145c28f1077a0", `1` = structure(list(
    a = -0.0406532756571652, b = 1L, c = 1L), .Names = c("a", 
"b", "c")), `2` = structure(list(a = 0.540306074206446, b = 2L, 
    c = 2L), .Names = c("a", "b", "c")), `3` = structure(list(
    a = -1.28846428560021, b = 3L, c = 3L), .Names = c("a", "b", 
"c")), `4` = structure(list(a = 2.219612871209, b = 4L, c = 4L), .Names = c("a", 
"b", "c")), `5` = structure(list(a = -1.34109378068153, b = 5L, 
    c = 5L), .Names = c("a", "b", "c")), `6` = structure(list(
    a = -0.0971508202872865, b = 6L, c = 6L), .Names = c("a", 
"b", "c")), `7` = structure(list(a = -1.3419987318416, b = 7L, 
    c = 7L), .Names = c("a", "b", "c")), `8` = structure(list(
    a = -0.365034225520606, b = 8L, c = 8L), .Names = c("a", 
"b", "c")), `9` = structure(list(a = -0.0840790077727742, b = 9L, 
    c = 9L), .Names = c("a", "b", "c")), `10` = structure(list(
    a = 0.797477456457765, b = 10L, c = 10L), .Names = c("a", 
"b", "c"))), .Names = c("_id", "1", "2", "3", "4", "5", "6", 
"7", "8", "9", "10"))) 

Как я могу получить обратно к исходному кадру данных? Я попытался вырезать элемент _id и используя as.data.frame, однако я получаю это:

l1 <- l[[1]] 
l.df <- as.data.frame(l1[2:11]) 
> str(l.df) 
'data.frame': 1 obs. of 30 variables: 
$ X1.a : num -0.0407 
$ X1.b : int 1 
$ X1.c : int 1 
$ X2.a : num 0.54 
$ X2.b : int 2 
$ X2.c : int 2 
$ X3.a : num -1.29 
$ X3.b : int 3 
$ X3.c : int 3 
$ X4.a : num 2.22 
$ X4.b : int 4 
$ X4.c : int 4 
$ X5.a : num -1.34 
$ X5.b : int 5 
$ X5.c : int 5 
$ X6.a : num -0.0972 
$ X6.b : int 6 
$ X6.c : int 6 
$ X7.a : num -1.34 
$ X7.b : int 7 
$ X7.c : int 7 
$ X8.a : num -0.365 
$ X8.b : int 8 
$ X8.c : int 8 
$ X9.a : num -0.0841 
$ X9.b : int 9 
$ X9.c : int 9 
$ X10.a: num 0.797 
$ X10.b: int 10 
$ X10.c: int 10 

, очевидно, что не получилось ...

+0

Использование 'sample.list' в списке вы можете взломать что-нибудь вместе, как:' data.frame (setNames (lapply (имена (sample.df), функция (х) sapply (sample.list [[ 1]] [- 1], функция (y) y [[x]])), names (sample.df))) ' – thelatemail

+0

Спасибо, такие работы, однако лучше не зависеть от исходный кадр данных, который может быть давно ушел. Есть ли способ сделать это зависимым от sample.list? – variable

+0

Возможно, вместо этого выведите имена из 'sample.list' и замените соответствующие части кода на' names (sample.list [[1]] [2] [[1]]) ' – thelatemail

ответ

0

Вот что я построил с помощью thelatemail в :

mongolist.to.data.frame <- function(x){ 
    x.names <- names(x[[1]][2][[1]]) 
    x <- data.frame(setNames(lapply(x.names, function(y) sapply(x[[1]][-1], function(z) if(is.null(z[[y]])) return(NA) else return(z[[y]]))),x.names)) 
    return(x) 
}