2012-01-03 187 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