使用R语言跨多行比较数据帧中的两列

使用R语言跨多行比较数据帧中的两列,r,dataframe,compare,R,Dataframe,Compare,我有一个正在使用的数据框,我想在其中比较数据点PathwayName和ExpressionData。此比较将在1000万+数据帧的多行中进行。以下是我的数据框的前几行,每行中的内容仅以空格分隔: >View(df) PathwayName ExpressionData 1 41bbPathway BLACK 215538_at 210671_x_at... 215538_at na 2

我有一个正在使用的数据框,我想在其中比较数据点PathwayName和ExpressionData。此比较将在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)
我知道这行不通,所以我希望有人能帮忙。 我已经查阅了很多关于比较数据框中两列的问答,但我无法理解这些内容,因为我需要比较一行中的每一项内容,并找到任何类似的内容。在这种情况下,有…_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,]

这看起来确实像一个合并操作,尽管我猜您不只是希望输出中有3列,而是希望拖动匹配行中的一些其他信息。你应该发帖dputheaddf@42-我认为需要两列,第一列只有两个用空格隔开的术语。OP需要回答这两个问题。是的,@42,你是对的。我不希望输出中有3列。我只希望这两列保持原样,但第一列中只有两个术语被空格分隔,第二列中只有一个术语。正如@steveb所说,它毕竟应该是两列。我会在运行完dputheaddf的代码后添加它。你可以复制路径名列,并在路径后的所有内容中添加一个副本,然后在第二个副本中使用gsub.*BLACK+[0-9]{6}\u at.*,\\1,df$PathwayName,然后选择基因名与你所说的相同的行@JeremyS,有一种可能性,我也需要这个x_at和s_at基因,因此,如何将它添加到PNlist和EDlist中?我运行了这个结果哦,对了,从两个调用中删除x$。我更新了答案。我已将其删除,但在data.framePathwayName=gsub BLACK.*,PathwayName,PathwayGene=as.characterlapply1:lengthPNlist,:参数表示不同的行数:481、22284、1。这表示对象的长度不同,如果你有一个超过1000万行的data.frame,这些数字怎么可能呢?我不知道。