2012-01-03 174 views
2

我希望這個問題對於這個主板不是太簡單。data.frame切片

我已經創建了一個data.frame DF:

 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

[1] 5282380 18471829 45923789 44308022 44266812 24883465 24867475 24867460 

我想提取DF,其含有任意數量的VEC的行向量。我試圖通過這個代碼來解決這個問題:

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

df[df$GC==1,] 

但是這種解決方案的問題是,我只得到了行,其中包含在CID列只有一個號碼。沒有出現像第90行那樣在CID中包含多個值的行。

這個問題有沒有優雅的解決方案?

在此先感謝

回答

4

鑑於你對EDI的答案(我喜歡)的評論,我想我會做一個建議。

將逗號分隔值壓縮到數據框的單個列中很尷尬,並且(根據我的經驗)只會導致沮喪。我經常發現它更簡單,以保持它在一個單獨的數據結構,列表:

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 

您可以隨時使用rownames在dat和列表的名稱,以保持每個項目的直線,如果你擔心訂單改變。

(另請注意,我的匿名函數是假設ID將被R的範圍規則最終發現,你可以改變功能ID傳遞明確的,如果你喜歡。)

+0

謝謝你的提示。使用sqeezing逗號分隔值真令人沮喪:) – 2012-01-04 11:51:35

4

一種方法是使用grep():

> 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

尼斯。僅供參考,從R-2.14開始,感謝R-core,您可以通過單個命令「txt < - read.table(text =」Body of table「)讀取文本數據,避免顯式打開和關閉連接。 – 2012-01-03 13:59:02

+0

@Josh:謝謝! - 不知道。 – EDi 2012-01-03 14:26:01

+0

謝謝你的快速回答。該解決方案的問題在於,例如,一個ID「08」會找到幾行,儘管這些行只包含數字。是否可以僅選擇包含逗號之間的完整數字的行「5282380」而不只是「52823」或「2380」? – 2012-01-03 14:32:32