2016-11-15 2 views
1

У меня есть данные списка вложенных списков, которые должны быть в желаемом выходном представлении, либо как матричный объект, либо просто непосредственно экспортировать этот вложенный список как файл csv. Я попробовал несколько общих подходов к выполнению этой задачи, но экспорт вложенного списка идет не очень хорошо, поэтому я ищу решение, которое вставляет вложенный список в матричный или табличный объект, чтобы хранить данные желаемым образом. Возможно, я мог хранить вложенные данные списка в data.table, но не совсем уверен в этом. Может ли кто-нибудь сказать мне, как легко манипулировать этим видом? Как я могу достичь чистого, хорошо структурированного представления данных для вложенных данных списка? Есть идеи ? Большое спасибоКак вставить вложенный список в матричный или табличный объект?

мини пример:

выход пользовательской функции:

AcceptedList <- list(
    A_accepted = data.frame(pos.start=c(1,6,16), pos.stop=c(4,12,23), pos.ID=c("A1","A2","A3"), pos.score=c(11,8,13)), 
    B_accepted = data.frame(pos.start=c(7,19,31), pos.stop=c(13,28,43), pos.ID=c("B3","B6","B7"), pos.score=c(12,5,7)), 
    C_accepted = data.frame(pos.start=c(5,21,36), pos.stop=c(11,29,42), pos.ID=c("C2","C4","C9"), pos.score=c(7,13,9)) 
) 

RejectedList <- list(
    A_rejected = data.frame(pos.start=c(6,25,40), pos.stop=c(12,33,49), pos.ID=c("A2","A5","A8"), pos.score=c(8,4,7)), 
    B_rejected = data.frame(pos.start=c(15,19,47), pos.stop=c(18,28,55), pos.ID=c("B4","B6","B9"), pos.score=c(10,5,14)), 
    C_rejected = data.frame(pos.start=c(13,21,36,53), pos.stop=c(19,29,42,67), pos.ID=c("C3","C4","C9","C12"), pos.score=c(4,13,9,17)) 
) 

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

func <- function(mlist, threshold) { 
    res <- lapply(mlist, function(x) { 
    splt <- split(x, ifelse(x$pos.score >= threshold, "up", "down")) 
    }) 
    return(res) 
} 

#example 
.res_accepted <- func(AcceptedList, 9) 
.res_rejected <- func(RejectedList, 9) 

У меня есть трудное время как кейс вложенный список .res_accepted, .res_rejected как матрица подобный объект. Идеально экспортировать вложенный список как файл csv очень ожидаем, но я не смог экспортировать их желаемым образом. Как я могу это сделать?

в конечном счете, требуемый список файлов CSV с желаемыми назван следующим образом:

A_accepted_up.csv 
A_accepted_down.csv 
A_rejected_up.csv 
A_rejected_down.csv 
B_accepted_up.csv 
B_accepted_down.csv 
B_rejected_up.csv 
B_rejected_down.csv 
C_accepted_up.csv 
C_accepted_down.csv 
C_rejected_up.csv 
C_rejected_down.csv 

Дело в том, вложенный список возвращаемый моих пользовательских функций, так что я намерен либо непосредственно экспортировать их или бросить их в матрицу, как объект. Любая идея для такого рода манипуляций? Спасибо :)

ответ

4

Это возвращает data.frame DF данных. Пакеты не используются.

both <- do.call("rbind", c(AcceptedList, RejectedList)) 
cn <- c("letter", "accepted", "seq") 
DF <- cbind(
     read.table(text = chartr("_", ".", rownames(both)), sep = ".", col.names = cn), 
     both) 
DF <- transform(DF, updown = ifelse(pos.score > 8, "up", "down")) 

дает:

> DF 
      letter accepted seq pos.start pos.stop pos.ID pos.score updown 
A_accepted.1  A accepted 1   1  4  A1  11  up 
A_accepted.2  A accepted 2   6  12  A2   8 down 
A_accepted.3  A accepted 3  16  23  A3  13  up 
B_accepted.1  B accepted 1   7  13  B3  12  up 
B_accepted.2  B accepted 2  19  28  B6   5 down 
B_accepted.3  B accepted 3  31  43  B7   7 down 
C_accepted.1  C accepted 1   5  11  C2   7 down 
C_accepted.2  C accepted 2  21  29  C4  13  up 
C_accepted.3  C accepted 3  36  42  C9   9  up 
A_rejected.1  A rejected 1   6  12  A2   8 down 
A_rejected.2  A rejected 2  25  33  A5   4 down 
A_rejected.3  A rejected 3  40  49  A8   7 down 
B_rejected.1  B rejected 1  15  18  B4  10  up 
B_rejected.2  B rejected 2  19  28  B6   5 down 
B_rejected.3  B rejected 3  47  55  B9  14  up 
C_rejected.1  C rejected 1  13  19  C3   4 down 
C_rejected.2  C rejected 2  21  29  C4  13  up 
C_rejected.3  C rejected 3  36  42  C9   9  up 
C_rejected.4  C rejected 4  53  67 C12  17  up 

Это запишет DF в отдельных файлах:

junk <- by(DF, DF[c("letter", "accepted", "updown")], 
     function(x) write.csv(x[-(1:3)], 
     sprintf("%s_%s_%s.csv", x$letter[1], x$accepted[1], x$updown[1]))) 

или это будет выписывать кадры данных в .res_accepted - .res_rejected могут быть обработаны аналогичным образом:

junk <- lapply(names(.res_accepted), function(nm) 
    mapply(write.csv, 
      .res_accepted[[nm]], 
      paste0(nm, "_", names(.res_accepted[[nm]]), ".csv"))) 

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

AcceptedList <- 
structure(list(foo_accepted = structure(list(pos.start = c(1, 
6, 16), pos.stop = c(4, 12, 23), pos.ID = structure(1:3, .Label = c("A1", 
"A2", "A3"), class = "factor"), pos.score = c(11, 8, 13)), .Names = c("pos.start", 
"pos.stop", "pos.ID", "pos.score"), row.names = c(NA, -3L), class = "data.frame"), 
    bar_accepted = structure(list(pos.start = c(7, 19, 31), pos.stop = c(13, 
    28, 43), pos.ID = structure(1:3, .Label = c("B3", "B6", "B7" 
    ), class = "factor"), pos.score = c(12, 5, 7)), .Names = c("pos.start", 
    "pos.stop", "pos.ID", "pos.score"), row.names = c(NA, -3L 
    ), class = "data.frame"), cat_accepted = structure(list(pos.start = c(5, 
    21, 36), pos.stop = c(11, 29, 42), pos.ID = structure(1:3, .Label = c("C2", 
    "C4", "C9"), class = "factor"), pos.score = c(7, 13, 9)), .Names = c("pos.start", 
    "pos.stop", "pos.ID", "pos.score"), row.names = c(NA, -3L 
    ), class = "data.frame")), .Names = c("foo_accepted", "bar_accepted", 
"cat_accepted")) 

RejectedList <- 
structure(list(foo_rejected = structure(list(pos.start = c(6, 
25, 40), pos.stop = c(12, 33, 49), pos.ID = structure(1:3, .Label = c("A2", 
"A5", "A8"), class = "factor"), pos.score = c(8, 4, 7)), .Names = c("pos.start", 
"pos.stop", "pos.ID", "pos.score"), row.names = c(NA, -3L), class = "data.frame"), 
    bar_rejected = structure(list(pos.start = c(15, 19, 47), 
     pos.stop = c(18, 28, 55), pos.ID = structure(1:3, .Label = c("B4", 
     "B6", "B9"), class = "factor"), pos.score = c(10, 5, 
     14)), .Names = c("pos.start", "pos.stop", "pos.ID", "pos.score" 
    ), row.names = c(NA, -3L), class = "data.frame"), cat_rejected = structure(list(
     pos.start = c(13, 21, 36, 53), pos.stop = c(19, 29, 42, 
     67), pos.ID = structure(c(2L, 3L, 4L, 1L), .Label = c("C12", 
     "C3", "C4", "C9"), class = "factor"), pos.score = c(4, 
     13, 9, 17)), .Names = c("pos.start", "pos.stop", "pos.ID", 
    "pos.score"), row.names = c(NA, -4L), class = "data.frame")), 
.Names = c("foo_rejected", 
"bar_rejected", "cat_rejected")) 
+0

Огромное спасибо. Это именно то, что я хочу сделать. огромное спасибо :) – Jerry

+0

Я понял роль. Еще раз спасибо за ваш вклад :) – Jerry

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