2016-08-16 3 views
-1

data.frameオブジェクトのリストに対してsetdiff操作を再帰的に実行するための私のカスタム関数を書きました。今私のカスタム関数は、名前のないdata.frameオブジェクトのリストを返します。しかし、各リストの各data.frameには、非常に特定の順序の名前が必要です。私は、各リストにnamed.frameオブジェクトを返すために、私のカスタム関数で必要とされる変更はほとんどないことを認識しています。私はそれらの名前を割り当てようとしましたが、それは優雅ではありませんでした。期待される結果を得るにはどうすればいいですか?誰でも可能なアイデアを提案し、カスタム機能のコードを修正し改善することはできますか? FYI、すべてのデータ、カスタム関数、希望出力がシミュレートされます。デフォルトの数値インデックスを使用するのではなく、リスト内の名前付き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)) 
) 

私はこのカスタム関数をコード化:私のカスタム関数の

library(dplyr) 

func <- function(list, idx=1L) { 
    entry <- list[[idx]] 
    self_ <- setdiff(entry, entry) 
    res <- lapply(list[-idx], function(ele_) { 
    joined_ <- setdiff(entry, ele_) 
    joined_ 
    }) 
    result <- c(list(self_), res) 
    return(result) 
} 

出力を、次のとおりです。私は私のカスタム関数が明示的に名前を指定する必要があり期待

res_1 <- func(list = myList, idx = 1L) 
res_2 <- func(list = myList, idx = 2L) 
res_3 <- func(list = myList, idx = 3L) 

各リストのdata.frameは、デフォルトの数値インデックスではなく、非常に異なる順序で表示されます。

所望の出力:

res_1 <- list(foo=data.frame(), bar=data.frame(), bleh=data.frame()) 
res_2 <- list(bar=data.frame(), foo=data.frame(), bleh=data.frame()) 
res_3 <- list(bleh=data.frame(), foo=data.frame(), bar=data.frame()) 

どのように私は私の所望の出力を達成することができますか?私のカスタム機能で問題を解決するためのスマートな方法はありますか?これをどうすればいいのですか?おかげでたくさんの

+1

いいえ、あなたはできる: 'idxs = 1:3; lapply(idxs、function(x)myList [seq_along(myList)[order(seq_along(myList)!= x)]]) 'しかし、私はdata.framesのリストを並べ替える良い理由はないと思っています... – Frank

+1

@フランク:< - ?を使うのではなく、リストで "="演算子を使うことについて詳しく説明できますか?どうして? – user88911

+1

'x = list(a = 1、b = 2)'では、listは関数であり、aとbは引数名です。引数名は '='だけで渡します。引数名を渡すことは、代入とは別の作業です。代入のために、私は 'x = 1'または' x < - 1'を実行できます。 argsを関数に渡すときは、 '='のみが機能します。 – Frank

答えて

1

他のコメンテーターが指摘したように、あなたはあなたが得ることができることを行っているたら

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

つまり、あなたのリストに名前の要素を割り当てることが=ではなく<-を使用する必要がありますあなたの関数に1行追加して望む結果を返します。

func <- function(list, idx=1L) { 
    entry <- list[[idx]] 
    self_ <- setdiff(entry, entry) 
    res <- lapply(list[-idx], function(ele_) { 
     joined_ <- setdiff(entry, ele_) 
    }) 
    result <- c(list(entry), res) 
    names(result) <- c(names(list[idx]),names(list[-idx])) 
    return(result) 
} 
関連する問題