2013-07-24 13 views
25

2つのベクトルにmapplyを使用して名前付きリストを作成する方法はありますか?最初のベクトルはタイプcharacterであり、リストに使用される名前を含み、2番目の値は値を含みます。2つのベクトル(名前、値)から名前付きリストを作成

はこれまでのところ、私が唯一の解決策は以下のとおりです。

> dummyList = list() 
> addToList <- function(name, value) { 
+ dummyList[[name]] <- value 
+ } 
> mapply(addToList, c("foo", "bar"), as.list(c(1, 2)) 
$foo 
`1` 

$bar 
`2` 

これはかなり不自然なソリューションのように思えるが、私はそうでない場合はそれを行う方法を見つけ出すことはできません。私はそれを持っている問題は次のとおりである:それはmapplyへの呼び出しの後に空のリストをdummyListが変更されることはありませんにもかかわらずdummyListの作成を必要としている

  1. 数値ベクトルc(1, 2)がリストに変換されない場合、mapplyの呼び出しの結果は、doublesの名前付きベクトルになります。

問題2を回避するために、私はいつもちょうど2つのベクトルにmapplyを呼び出し、その結果にas.listを呼び出しますが、直接、値がでているとのリストを作成する方法があるべきように思えることができますベクター。

答えて

46

あなたは(ベクトルに対して)setNames()

(リスト用)
setNames(as.list(c(1,2)), c("foo", "bar")) 

または

setNames(c(1,2), c("foo", "bar")) 

を使用することができます

+2

ありがとうございます。私は 'setNames'関数を認識しておらず、私の目標に完全に合っています。好奇心のために、あなたが知っている 'lapply'を使ってそれを行う方法はありますか? 'lapply'がリストを返すことができるようです。 –

+0

「lapplyを使って」とはどういう意味ですか? 'lapply'を使って同じタスクを実行しますか? (もしそうなら、なぜ?プログラミングの練習として、より多くの文脈が役に立つでしょう。)他に何かしたいのですが、あなたの質問を編集するか、新しい質問をしますか? –

8

私はあなたがこれをしたいかもしれない理由についてベンの戸惑いを共有し、と彼の推薦。

x <- letters[1:2] 
y <- 1:2 
mapply(function(x,y) { y }, x, y, SIMPLIFY = FALSE,USE.NAMES = TRUE) 
$a 
[1] 1 

$b 
[1] 2 

USE.NAMESのドキュメントが言うことに注目:

USE.NAMES論理だけで好奇心のために

は、これを許可しますmapplyで「隠し」機能のようなものがあります;最初の...引数に名前がある場合は名前を使用し、文字ベクトルの場合は を使用する場合は、その文字ベクトルを名前として使用します。

+1

私はこれが単なる縮退した使用例ではないと思います。私は2つのダブル配列をそれぞれUSE.NAMESによって自動的に選択されなかった何らかのrow.names列で結合する必要があったので、row.names(x)を手作業で引数として渡さなければなりませんでしたf = function(n、x、y){if(y> 0){-1 * x} else {x}}; r = mapply(f、row.names(x)、x、y、SIMPLIFY = F、USE.NAMES = T) '。 'data.frame(unlist(r))'がジョブを終了しました。この機能を指摘してくれてありがとう! –

関連する問題