2012-01-03 6 views
2

私はこの質問がこのボードにとってあまりにも単純ではないと願っています。data.frameスライシング

 CAS  Name  CID 
89 13010-47-4 Lomustine   3950 
90 130209-82-4 Latanoprost  5311221,5282380,46705340,3890 
91 130636-43-0 Nifekalant  268083 
92 130929-57-6 Entacapone  5281081 

と私はVECの任意の数を含んでDFの行を抽出したい

[1] 5282380 18471829 45923789 44308022 44266812 24883465 24867475 24867460 

VECベクトル:

私はdata.frameのDFを作成しました。

df$GC[(df$CID %in% vec)] = 1 

df[df$GC==1,] 

しかし、この解決策の問題は、私は唯一のCID列に一つだけの数を含む行を、得ること、である:私は、このコードによって、この問題を解決しようとしました。行90のようなCIDに複数の値を含む行は表示されません。

この問題の解決策はありますか?事前

答えて

4

私は提案を作るだろうと思っていました。

カンマ区切りの値をデータフレームの1つの列に圧縮するのは難しく、(私の経験では)欲求不満につながるだけです。私しばしばそれは単純、別のデータ構造内のリストをそれを維持するために見つける:

dat <- read.table(text = "  CAS  Name  CID 
    13010-47-4 Lomustine   3950 
    130209-82-4 Latanoprost  5311221,5282380,46705340,3890 
    130636-43-0 Nifekalant  268083 
    130929-57-6 Entacapone  5281081",sep = "",header = TRUE) 

cid <- sapply(dat$CID,strsplit,",",USE.NAMES = FALSE) 

この形式では、物事は多くの場合で動作するように簡単です:

ID <- c(5282380, 18471829, 45923789, 44308022, 44266812, 24883465, 24867475, 24867460, 3950) 
dat[sapply(cid,function(x) {any(x %in% as.character(ID))}),] 
      CAS  Name       CID 
1 13010-47-4 Lomustine       3950 
2 130209-82-4 Latanoprost 5311221,5282380,46705340,3890 

あなたは常にdatでrownamesを使用することができます順序が変わることを心配している場合は、各項目を真っ直ぐに保つためのリストの名前を入力します。

+0

ヒントありがとうございます。コンマで区切られた値をsqeezingする作業は本当にイライラです:) –

4

おかげで一つの方法は、()はgrepを使用することです:

(私は好き)EDIの答えにあなたのコメントを考えると
> txt <- "  CAS  Name  CID 
+ 13010-47-4 Lomustine   3950 
+ 130209-82-4 Latanoprost  5311221,5282380,46705340,3890 
+ 130636-43-0 Nifekalant  268083 
+ 130929-57-6 Entacapone  5281081 
+ " 
> con <- textConnection(txt) 
> df <- read.table(con, header = TRUE) 
> close(con) 
> ID <- c(5282380, 18471829, 45923789, 44308022, 44266812, 24883465, 24867475, 24867460, 3950) 
> grep(paste("\\b", ID, "\\b", sep="", collapse = "|"), dat$CID) 
[1] 1 2 
+1

ニースは、

は(あなたが好きな場合は、明示的IDに渡す機能を変更することができます。また、私の無名関数がIDはRのスコープルールにより最終的に発見されることを想定していることに注意してください)。 FYI、R-2.14以降、Rコアのおかげで、テキストデータを単一のコマンド 'txt < - read.table(text =" Body of table ")'で読み込むことができます。接続のクローズ。 –

+0

@ジョシュ:ありがとう! - それを知らなかった。 – EDi

+0

すぐにお返事ありがとうございます。この解決策の問題は、例えば、 ID「08」には複数の行がありますが、これらの行には数字のみが含まれています。カンマの間に完全な数字を含む行のみを選択することは可能ですか? "5282380"だけでなく、 "2380"だけでなく、 –