使用R语言跨多行比较数据帧中的两列
我有一个正在使用的数据框,我想在其中比较数据点PathwayName和ExpressionData。此比较将在1000万+数据帧的多行中进行。以下是我的数据框的前几行,每行中的内容仅以空格分隔:使用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
>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,这些数字怎么可能呢?我不知道。