2016-08-17 9 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)) 
) 

カスタム関数の必要性:私は私のカスタム関数は、誰もが私を与えるobject.Can data.frameの複数のリストを返すことを期待

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) 
} 

所望の出力

いくつかのアイデア?ありがとう

+0

'func'はどうするのですか?今は出力形式を気にしないでください。入力にどのような計算を実行しようとしていますか? – jdobres

+3

*「常にリストを使用しているのは退屈です」* ???これはどういう意味ですか?リストは効果的で柔軟性があります。それがあなたをより幸せにするなら、あなたはそれらに興味深い名前を付けることができます。 * "Rのどのデータ構造体が、基底Rのdata.frame"の非常に大きな複数のリストを格納するのに適しているかは、リストと環境のデータフレームのリストを持つことができる2つの構造体があります。 * boredom *以外では、リストを使用する際の問題は何ですか? – Gregor

+0

あなたの例は再現できません。 "改善された"機能は何もしないようです。私の答えは、元の例の意図に対応しています。あなたの例が不十分なので、私はあなたにそれ以上の具体的な答えを与えることはできません。私たちはあなたの心を読むことができません。 – jdobres

答えて

1

私はまだあなたの意図を理解するのに少し問題がありますが、ここではよりクリーンなソリューションの提案があります。

まず、それがフラットなデータフレームとしてデータを保存するために、多くの場合、はるかに簡単です:

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 

その後、我々は、2基の組み合わせをループに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 

いくつかの比較はTWに表示されますそれぞれのグループは "group1"または "group2"の列に表示され、私のコードはそれらの重複をスキップしませんが、これはあなたを起動させるはずです。

+0

あなたは正しいです。私は実際に実装に間違っています。ありがとうございました。 – user88911

関連する問題