使用R语言在多行中比较数据框中的两列

时间:2016-01-26 08:07:59

标签: r dataframe compare

我有一个数据框,我正在其中工作,我想将数据点PathwayNameExpressionData进行比较。这种比较将在数据帧的许多行(1000万+)之间进行。以下是我的数据框的前几行,其中每行内的内容仅以空格分隔:

>View(df)

    PathwayName                                      ExpressionData 
1   41bbPathway BLACK   215538_at   210671_x_at...   215538_at  na  28.566616...
2   ace2Pathway BLACK   214533_at   215184_at...     215538_at  na  28.566616...    
3   acetPathway BLACK   215184_at   01502_s_at...    215184_at  na  4.2084746...
4   achPathway  BLACK   211570_s_at 215184_at...     215184_at  na  4.2084746...
5   hoPathway   BLACK   201968_at   214578_s_at...   201968_at  na  472.4969...

作为最终产品,我希望它能够比较,复制并保存到一个新文件中,其输出应该是这样的:

>View(df)

    PathwayName               ExpressionData 
1   41bbPathway 215538_at     215538_at         
2   acetPathway 215184_at     215184_at 
3   achPathway  215184_at     215184_at 
4   hoPathway   201968_at     201968_at  

这就是我所做的:

sub("BLACK.*", "", df)

我知道这不起作用,所以我希望有人可以提供帮助。 关于比较数据框中的两列,我已经查看了许多Q& A,但我不能遵循这些,因为,我需要比较行中的每个内容并找到任何类似的内容(in this case the one with ..._at)而不是仅根据列进行比较。

希望有人知道这一点。 谢谢。

1 个答案:

答案 0 :(得分:0)

这不是一个简单的任务,_at,_x_at和_s_at基因的顺序是不一致的,我猜它们有不同的长度。我做的另一个假设是ExpressionData每行只列出一个基因,如果违反,这将无法正常工作。所以我会使用列表而不是data.frame,因为它使得比较更简单。由于我们只使用了一段数据,我只使用它。

# firstly to make the data
PathwayName <-                                       
c("41bbPathway BLACK   215538_at   210671_x_at...",
"ace2Pathway BLACK   214533_at   215184_at...",
"acetPathway BLACK   215184_at   01502_s_at...",
"achPathway  BLACK   211570_s_at 215184_at...",
"hoPathway   BLACK   201968_at   214578_s_at...")
 PathwayName <- gsub("\\.\\.\\.","",PathwayName) # you shouldn't need this, it only fixes the partial data you supplied when I copied and pasted

ExpressionData <- 
c("215538_at  na  28.566616...",
"215538_at  na  28.566616...",
"215184_at  na  4.2084746...",
"215184_at  na  4.2084746...",
"201968_at  na  472.4969...")
  ExpressionData <- gsub("\\.\\.\\.","",ExpressionData) # you shouldn't need this, it only fixes the partial data you supplied when I copied and pasted

# to compare
PNlist <- sapply(PathwayName,function(x) strsplit(x, split=" ")) # make a list from each line
PNlist <- lapply(PNlist, function(x) x[grepl("_at",x)]) # select genes
EDlist <- sapply(ExpressionData,function(x) strsplit(x, split=" "))
EDlist <- lapply(EDlist, function(x) x[grepl("_at",x)])

Result <- data.frame("PathwayName"=gsub(" BLACK.*","",PathwayName),
                     "PathwayGene"=as.character(lapply(1:length(PNlist),function(x) PNlist[[x]][PNlist[[x]] %in% EDlist[[x]]])),
                     "ExpressionData"=gsub(" .*","",ExpressionData),stringsAsFactors=F)
# this will return a 'character(0)' if PathwayName has no gene matching ExpressionData so the next line corrects for this
Result <- Result[Result$PathwayGene == Result$ExpressionData,]