我有一个数据框,我正在其中工作,我想将数据点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)
我知道这不起作用,所以我希望有人可以提供帮助。
关于比较数据框中的两列,我已经查看了许多Q& A,但我不能遵循这些,因为,我需要比较行中的每个内容并找到任何类似的内容(in this case the one with ..._at
)而不是仅根据列进行比较。
希望有人知道这一点。 谢谢。
答案 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,]