2016-06-19 5 views
0

私は2つの行列を持ち、1つはindex行列(ncol = 1、nrow = 20,000)で、検索したい値を格納し、もう1つの行列はdata行列で、大きなデータセットを格納します(ncol = 1、nrow = 5,000)。行列を検索して複数の値を検索し、行名を返す方法

indexマトリックス:(watermeatgas ....行名)

water DFAFADFADF 
meat  QEREQRQTQTQ 
gas  FEQQFQEFQF 
. 
. 
. 
.. 
data

マトリックス:

TomLuisJerryVincentRichard ...列名)
Tom    dfqfqfAFADFADaveffefd 
Luis    eqeqfqefAFADFADuouojoimoij 
Jerry   dafadfe3321AFADFADfdeff 
Vincent   e31413413qeffffff 
Richard   121eefq3ffAFADFADfffqffqff 
. 
. 
. 
.. 

indexの各値、01のどの行を検索したいですか?行列の文字列をCONTAIN(S)に変換し、そのdataの行列の行名を記録し、index行列内のその文字列の次の列(または単一の列で区切りますが、 "、"で区切った列)に入れます。

たとえば、インデックス行列から値を取り出し、データ行列のどの行がこの文字列を含んでいるかを検索すると、トム、ルイス、ジェリー、リチャードがdataの行列に含まれています

water DFAFADFADF Tom, Luis, Jerry, Richard 
meat  QEREQRQTQTQ 
gas  FEQQFQEFQF 
. 
. 
. 
.. 

そして私は再びdata行列を検索するために、indexマトリックス、QEREQRQTQTQに次の値を取る:文字列なので、私は

index行列であることをindex行列を更新しますindex行列の最後の行が終了するまで、index行列を再度更新してください。

ループを手助けする人はいますか?私たちはfor (....)を使ってループが必要かもしれないと思いますが、どうすればよいか分かりません。

+0

あなたは '%中%'や 'match' – akrun

+0

を使用することができます。例をお願いできますか?どうもありがとう!私はこれに完全にナイーブです... –

答えて

0
index <- data.frame(one = c("ABC", "DEF", "GHI", "JKL")) 
rownames(index) <- c("water", "meat", "fruit", "bread") 
data <- data.frame(one = c("ABCDEF", "DEFZMN", "MNOABC", "ZXCJKL")) 
rownames(data) <- c("Tom", "Jerry", "Rob", "Nate") 

results <- data.frame() 
for (r in 1:nrow(index)) { 
    index$results[r] <- list(rownames(data)[grep(index$one[r], data$one, ignore.case = T)]) 
    count <- length(unlist(index$results[r])) 
    df <- data.frame(data_match = unlist(index$results[r]), 
        pattern = rep(index$one[r], times = count), 
        index_match = rep(rownames(index)[r], times = count)) 
    results <- rbind(results, df) 
} 
reshape2::dcast(results, index_match ~ data_match) 

これは、列のインデックス$結果でlist()を生成しますので、あなたは、あなたが下り、その情報を処理する方法に応じて、それにunlist()を呼び出す必要があります。

index <- c("ABC", "DEF", "GHI", "JKL") 
names(index) <- c("water", "meat", "fruit", "bread") 

次回のためのマッチングを簡単にすることがあります。またRにあなたがベクトルを命名し、ケースを持っていることができ、あなたは多分あなたは、このような名前の文字ベクトルがちょうど必要な場合があります1つの列のデータフレームを持っていました。

+0

親愛なるネイサン、あなたの大きな助けをありがとう!出来た!!!しかし、あなたが言及したように、index $ resultはインデックス行列のすべての行のリストなので、 "index"の結果を出力するのに問題がありました。このインデックスマトリックスをCSVファイルに出力する方法はありますか? write.table(index、file = "index.csv"、sep = "、")を動作させるために、インデックス$結果を何かに変換する必要がありますか?あるいは、「インデックス」マトリックスを置くより良い方法がありますか?あなたの大きな助けをありがとう! –

+0

私は、csv readyデータフレームを構築するための作業を一緒にしました。どのようにマルチカラム結果フォーマットに強制するのかまだ分かりません... – Nate

+0

これを行うにはもっと良い方法があるはずですが、わかりません。そのソリューションはあなたのために動作することを願って – Nate

0

短いソリューション:

row.names(data)[apply(data, 1, function(x) { 
    sapply(x, function(y) y %in% c("DFAFADFADF", "QEREQRQTQTQ", "FEQQFQEFQF")) 
}), ] 
+0

こんにちはマイク、あなたのソリューションをありがとう。私の質問の中の例に基づいて、c( "a"、 "b"、3)の声をさらに明確にすることはできますか?そして、どこから読んだのですか?私は完全にコーディングに素朴です。どうもありがとう! –

+0

これらは、洗濯行で特定しようとしている値を表します。 apply(matrix、1、function)関数を使用すると、各行(1)または各列(2)を使用して関数を実行できます。より複雑な関数は、apply(matrix、1、function(x)foo(foo2(x))で呼び出すことができます。 ()呼び出しとyは、相互参照値関数で使用されるオブジェクト(行のn番目の値)です。 – mkearney

関連する問題