2016-08-17 2 views
-4

У меня есть список data.frame как вход для моей пользовательской функции, я ожидаю, что пользовательская функция вернет несколько списков data.frame. Я сделал некоторые изменения кода в своей функции, но возвратил неожиданный вывод. Может ли кто-нибудь предложить мне, как улучшить код в пользовательской функции? Где я ошибался в своем коде? Любой намек?Как эффективно перебирать список data.frame как вход для пользовательской функции?

данные

myList <- list(
    foo = data.frame(start=seq(1, by=4, len=6), stop=seq(3, by=4, len=6)), 
    bar = data.frame(start=seq(5, by=2, len=7), stop=seq(7, by=2, len=7)), 
    bleh = data.frame(start=seq(1, by=5, len=5), stop=seq(3, by=5, len=5)) 
) 

пользовательские функции необходимость в оптимизировано:

func <- function(set) { 
    # check input param 
    stopifnot(is.list(set)) 
    output <- list() 
    require(dplyr) 
    for(id in 1: seq_along(set)) { 
    entry <- set[[id]] 
    self_ <- setdiff(entry, entry) 
    res <- lapply(set[-id], function(ele_) { 
     joined_ <- setdiff(entry, ele_) 
    }) 
    ans <- c(list(self_), res) 
    names(ans) <- c(names(set[id]),names(set[-id])) 
    output[id] <- ans 
    } 
    return(output) 
} 

желаемый результат

Я ожидаю, что моя пользовательская функция будет возвращать несколько список из data.frame object.Can кто-нибудь дать мне какая-то идея? Спасибо

+0

Что именно должен делать 'func'? Не обращайте внимания на его формат вывода на данный момент; какой расчет вы пытаетесь выполнить на входе? – jdobres

+3

* «всегда использовать список скучно» * ??? Что ты хочешь этим сказать? Списки эффективны и гибки. Вы можете дать им интересные имена, если это сделает вас счастливее. * «Какая структура data.structure в R более подходит для хранения очень большого большого списка data.frame» * в базе R, есть две структуры, которые могут иметь в себе списки фреймов данных: списки и среды. Помимо * скуки *, каковы ваши проблемы с использованием списков? – Gregor

+0

Ваш пример не воспроизводится. «Улучшенная» функция, похоже, ничего не делает. Мой ответ касается намерения вашего первоначального примера. Я не могу дать вам более конкретный ответ, потому что вашего примера недостаточно. Мы не можем читать ваши мысли. – jdobres

ответ

1

У меня все еще мало проблем с пониманием ваших намерений, но вот предложение для более чистого решения.

Во-первых, это часто намного проще хранить данные в виде плоского dataframe:

library(plyr) 
df <- ldply(df.list, rbind, .id = 'group1') 

    group1 V1 V2 
1  a 1 1 
2  a 1 0 
3  a 1 4 
4  a 2 5 
... 
18  c 4 3 

Тогда мы можем использовать plyr перебрать комбинации двух групп и вычислить их набор отличий:

df.setdiff <- ddply(df, .(group1), function(x) { 
    comparisons <- subset(df, group1 != x$group1[1]) 
    colnames(comparisons) <- c('group2', 'V1', 'V2') 
    res <- ddply(comparisons, .(group2), function(y) { 
     return(setdiff(x[c('V1', 'V2')], y[c('V1', 'V2')])) 
    }) 
}) 

Это производит один кадр данных:

group1 group2 V1 V2 
1  a  b 1 1 
2  a  b 1 0 
3  a  b 1 4 
4  a  b 2 5 
5  a  b 3 0 
6  a  b 0 2 
7  a  c 1 4 
8  a  c 2 5 
9  a  c 3 0 
10  a  c 0 2 
... 
24  c  b 0 3 

Некоторые сравнения появляются служ лед, так как каждая группа может появляться в столбце «group1» или «group2», и мой код не пропускает эти дубликаты, но это должно вас начать.

+0

Вы правы. Я действительно ошибаюсь в реализации. Спасибо. – user88911

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