2015-11-28 2 views
1

Я пишу функцию, которая соответствует имени, именам столбцов в их соответствующих data.frames. Эти три элемента содержатся отдельно в списке, в котором список содержит три списка, содержащие три элемента: один список содержит имя data.frame, другое - имена столбцов data.frames и еще один список data.frames , Результат объединяется только с одним списком, содержащим все data.frames.Сопоставление столбцов и столбцов данных, где имена столбцов содержатся в списке, а data.frames содержатся в другом списке.

Чтобы сделать вещи проще, я создал следующий пример данных:

lists.of.dfs<- structure(list(name = c("A", "B", "C"), 
header = list(c("DATE", "NAME", "AGE"), c("CITY", "STREET"), 
c("ID", "FIRST_NAME", "LAST_NAME")), 
df = list(structure(c("2015-11-05","James", "15", "2015-11-05", "Jack", 
"11", "2015-11-05", "Jim", "11"), .Dim = c(3L, 3L)), 
structure(c("Los Angeles", "Brougham", "Auckland", "Peel", "Darwin", 
"Derby", "Dunedin", "Palmerston"), .Dim = c(4L,2L)), structure(c("11462", 
"Tony", "Eric", "23467", "Kane", "Grant", "907894", "Dolby", 
"Fitzgerald"), .Dim = c(3L,3L))))) 

Я пытался сделать это, но не работает.

make.df<-function(lst){ 
     tbl<-lapply(1:length(lst$name), function (i){ names(lst$df[[i]])<- lst$headers[[i]]}) 
     names(tbl)<-lst$name 
     return(tbl) 
} 

Любые предложения?

ответ

1

После фиксации вашего примера структуры (со второй матрицы уже транспонировать, в то время как другие не являются), вы можете использовать следующий код:

lists.of.dfs<- structure(list(
    name = c("A", "B", "C"), 
    header = list(c("DATE", "NAME", "AGE"), 
       c("CITY", "STREET"), 
       c("ID", "FIRST_NAME", "LAST_NAME")), 
    df = list(structure(c("2015-11-05","James", "15", 
         "2015-11-05", "Jack", "11", 
         "2015-11-05", "Jim", "11"), 
         .Dim = c(3L, 3L)), 
      structure(c("Los Angeles", "Brougham", 
         "Auckland", "Peel", 
         "Darwin", "Derby", 
         "Dunedin", "Palmerston"), 
         .Dim = c(2L,4L)), 
      structure(c("11462","Tony", "Eric", 
         "23467", "Kane", "Grant", 
         "907894", "Dolby","Fitzgerald"), 
         .Dim = c(3L,3L))))) 

make.df<-function(lst){ 

    tbl<-lapply(1:length(lst$name), 
       function (i){ 
        DF <- as.data.frame(t(lst$df[[i]]),stringsAsFactors=FALSE) 
        names(DF) <- lst$header[[i]] 
        return(DF) 
       }) 
    names(tbl)<-lst$name 
    return(tbl) 
} 

Результат:

> make.df(lists.of.dfs) 
$A 
     DATE NAME AGE 
1 2015-11-05 James 15 
2 2015-11-05 Jack 11 
3 2015-11-05 Jim 11 

$B 
     CITY  STREET 
1 Los Angeles Brougham 
2 Auckland  Peel 
3  Darwin  Derby 
4  Dunedin Palmerston 

$C 
     ID FIRST_NAME LAST_NAME 
1 11462  Tony  Eric 
2 23467  Kane  Grant 
3 907894  Dolby Fitzgerald 
+1

работает на это часами. Должно было поместить эти данные в фиктивную переменную и вернуть ее. Почему я об этом не подумал? Благодарю. – geodex