2

私は非常に新しいRので、これが非常に基本的な質問である場合はご容赦ください。以下の手順を使用して、うまくいけばより意味のある質問を編集しました。

dこのようなデータフレームがあります

SAMPLE <-c("blueberry", "broccoli")
OPT1 <-c("apple", "beef")
OPT2 <-c("oatmeal", "bacon")
RESPONSE <- c("oatmeal", "beef")
d <- data.frame(SAMPLE,OPT1,OPT2, RESPONSE)

新しいデータの NA の列を追加

d$OPT1.D <- rep("NA",nrow(d));

と距離行列dist

X <-c("blueberry", "beef", "oatmeal", "broccoli")
blueberry <-c("0", "0.17", "0.09", "0.21")
beef <-c("0.15", "0", "0.979", "0.75")
oatmeal <- c("0.09", "0.375", "0", "0.71")
broccoli <- c("0.25", "0.671", "0.45", "0")
dist <- data.frame(X,blueberry,beef, oatmeal, broccoli)

distしたがって、 ford$RESPONSEとで行/列の一致を見つけたいと思いますd$SAMPLE。の新しい列でd$OPT1.Dは、最初のエントリは である必要があります0.09。これは、 の「オートミール」と「ブルーベリー」の間の距離distです。2 番目のエントリは0.671、「牛肉」と「ブロッコリー」の間の距離です。

これがより理にかなっていることを願っていますか?以下のコードを使用しましたd$OPT1.D <- dist[cbind(d$RESPONSE, d$SAMPLE)]が、数値ではなくテキストが返されました。どうもありがとう。

全体として、これはかなり簡単な操作のように思えますが、少し検索した後、これが FOR ループまたは data.table のようなパッケージによって実行されるのが最適かどうかわかりません。アドバイスをいただければ幸いです。

4

2 に答える 2

2

これは、R のあまり知られていないが非常に強力な機能であるマトリックス インデックス作成用に作成されたものです。必要なのは、このコマンドだけです (OPT2 についても繰り返します)。

d$OPT1D <- dist[cbind(d$RESPONSE, d$OPT1)]

ところで、他の人が簡単に読み取れるようにデータを含めると便利です。これを取得するために私が行ったことは次のとおりです。

d <- read.table(text="SAMPLE        OPT1        OPT2        RESPONSE        OPT1D        OPT2D
banana        blueberry   oatmeal     oatmeal         NA           NA
broccoli      beef        bacon       beef            NA           NA",
                 header=TRUE, stringsAsFactors=FALSE)
dist <- read.table(text="blueberry      beef           oatmeal
0              0.15           0.09
0.17           0              0.0872
0.09           0.0979         0", header=TRUE, stringsAsFactors=FALSE)
dist <- as.matrix(dist)
rownames(dist) <- colnames(dist)



> d
    SAMPLE      OPT1    OPT2 RESPONSE OPT1D OPT2D
1   banana blueberry oatmeal  oatmeal  0.09    NA
2 broccoli      beef   bacon     beef  0.00    NA
于 2013-02-09T20:11:14.483 に答える
2

最初の問題は、d の型が因数であり、dist[cbind(d$RESPONSE, d$OPT1)] でインデックスとして使用しようとすると、整数 (文字ではなく) に変換されることです。data.frame を呼び出すときは、stringsAsFactors = FALSE を使用する必要があります。

d <- data.frame(SAMPLE,OPT1,OPT2, RESPONSE, stringsAsFactors=FALSE)

2 番目の問題は、dist が data.frame であり、行名がないことです。また、X を列にする必要はありません。

dist <- cbind(blueberry,beef, oatmeal, broccoli)
rownames(dist) <- colnames(dist) <- X

このように、それはあなたが望むことをするはずです。

dist[cbind(d$RESPONSE, d$SAMPLE)]
[1] 0.090 0.671
于 2013-02-10T03:25:17.937 に答える