合并TCGA临床数据出现不同案例 列数不同 而难以cbind
library("XML")
library("methods")
dir="all/"
all_fiels=list.files(path = dir ,pattern='*.xml$',recursive=T)##导入文件
cl = lapply(all_fiels, function(x){
result <- xmlParse(file = file.path(dir,x))
rootnode <- xmlRoot(result)
xmldataframe <- xmlToDataFrame( rootnode[2] )
return(t(xmldataframe)) })
clinical <- t(do.call(cbind,cl))
write.table(clinical,file="clinical.txt",sep="\t",quote=F,row.names = F)##建议保存一下 一边后续使用
错误内容是:第10行代码:
Error in (function (..., deparse.level = 1) :
number of rows of matrices must match (see arg 36)
请教该如何解决?
数据附上:[]
(--来自百度网盘超级会员V6的分享
hi,这是我用百度网盘分享的内容~复制这段内容打开「百度网盘」APP即可获取
链接:https://pan.baidu.com/s/1Bx18Syf7_ngZRI2nSbGgUA
提取码:51e6)
初步构思:来自不同病重个案的临床数据列数不同因而不能cbind
解决方法:1.分开处理(但是不知道那些是一样的 那些是不一样的
解决方法:2.请各位指点一下如何修改现有代码实现目的。
参考GPT和自己的思路:这个错误提示说明你尝试使用cbind函数合并数据时,发现有些矩阵的行数不一致,无法进行合并。根据你的代码,我猜测这个问题可能是由于不同的xml文件中,数据的列数不同所导致的。
为了解决这个问题,你可以尝试以下几种方法:
1 对于不同的xml文件,手动添加缺失的列,并将缺失列填充为NA,确保每个矩阵的列数相同。具体来说,你可以先获取所有xml文件中出现过的列名,然后将这些列名添加到每个矩阵中,最后使用cbind函数进行合并。
2 如果你只需要合并每个xml文件中相同的列,而对于不同的列则不需要合并,那么可以使用merge函数进行合并。merge函数可以根据指定的列将多个数据框合并为一个数据框,合并时只保留指定的列,其它列将被删除。你可以先将每个xml文件转换为数据框,然后使用merge函数进行合并。
下面是示例代码,供你参考:
方法一:
library("XML")
library("methods")
dir="all/"
all_fiels=list.files(path = dir ,pattern='*.xml$',recursive=T)##导入文件
all_cols <- character(0) # 存储所有列名
cl <- lapply(all_fiels, function(x){
result <- xmlParse(file = file.path(dir,x))
rootnode <- xmlRoot(result)
xmldataframe <- xmlToDataFrame(rootnode[2])
# 将每个数据框的列名存储到all_cols中
all_cols <<- unique(c(all_cols, names(xmldataframe)))
# 添加缺失的列
xmldataframe[setdiff(all_cols, names(xmldataframe))] <- NA
return(t(xmldataframe))
})
clinical <- t(do.call(cbind,cl))
write.table(clinical,file="clinical.txt",sep="\t",quote=F,row.names = F)
方法二:
library("XML")
library("methods")
dir="all/"
all_fiels=list.files(path = dir ,pattern='*.xml$',recursive=T)##导入文件
cl <- lapply(all_fiels, function(x){
result <- xmlParse(file = file.path(dir,x))
rootnode <- xmlRoot(result)
xmldataframe <- xmlToDataFrame(rootnode[2])
return(xmldataframe)
})
# 根据SampleID列合并数据
clinical <- Reduce(function(x, y) merge(x, y, by = "SampleID"), cl)
write.table(clinical,file="clinical.txt",sep="\t",quote=F,row.names = F)
该回答引用GPTᴼᴾᴱᴺᴬᴵ
根据您提供的错误信息,“number of rows of matrices must match (see arg 36)”提示出现在第10行,这说明在尝试将结果合并为一个矩阵时,出现了行数不匹配的问题。这很可能是由于不同的临床数据具有不同的列数导致的。
·
您提出的两种解决方法都是可行的。对于第一种方法,您可以尝试手动检查不同的临床数据的列数并进行分类处理,然后使用cbind合并。对于第二种方法,您需要修改代码以处理不同列数的数据。
·
一个可行的解决方案是使用merge函数,而不是cbind函数。merge函数可以将两个数据框根据指定的列合并,而不考虑它们的列数是否相同。您可以使用类似于下面的代码:
library("XML")
library("methods")
dir="all/"
all_fiels=list.files(path = dir ,pattern='*.xml$',recursive=T)##导入文件
# 创建一个空数据框
clinical <- data.frame()
# 遍历所有文件,并将它们合并到clinical数据框中
for (file in all_files) {
# 解析文件
result <- xmlParse(file.path(dir, file))
rootnode <- xmlRoot(result)
xmldataframe <- xmlToDataFrame(rootnode[2])
# 将文件内容与clinical数据框合并
clinical <- merge(clinical, xmldataframe, by="列名", all=TRUE)
}
# 将结果保存为文件
write.table(clinical,file="clinical.txt",sep="\t",quote=F,row.names = F)
请注意,在上面的代码中,您需要将“列名”替换为您要用作合并依据的列的名称。
希望这可以帮助您解决问题。
参考GPT和自己的思路:
这个错误是因为要合并的矩阵的行数不相同,具体而言,arg 36表示要合并的矩阵的行数。可能是因为来自不同病例的临床数据列数不同,导致无法用cbind合并。
解决方法一:分开处理不同的数据矩阵,找到行数相同的矩阵再用cbind合并。
解决方法二:对于现有的代码,可以使用merge函数,而不是cbind函数,将来自不同病例的临床数据按照某个共同的标识(例如病例编号)进行合并,这样就不会出现行数不同的问题。具体代码如下:
1. library("XML")
2. library("methods")
3. dir="all/"
4. all_files=list.files(path = dir ,pattern='\*.xml$',recursive=T)##导入文件
5. cl = lapply(all_files, function(x){
6. result <- xmlParse(file = file.path(dir,x))
7. rootnode <- xmlRoot(result)
8. xmldataframe <- xmlToDataFrame( rootnode[2] )
9. return(data.frame(t(xmldataframe))) })
10. clinical <- Reduce(function(x,y) {merge(x,y, by = "patient_id", all=T)}, cl)
11. write.table(clinical, file = "clinical.txt", sep = "\t", quote = F, row.names = F)
注意:在这里假设病例的标识为"patient_id",如果不是,请根据实际情况修改"by"参数。
该回答引用ChatGPT
如有疑问,可以回复我!
这个错误是因为在尝试使用cbind将所有数据框组合在一起时,它们的行数不匹配。为了解决这个问题,可以先将所有数据框按照一个共同的键(例如患者ID)进行整合,然后再合并。以下是一个使用dplyr库进行整合和合并的示例
library("XML")
library("methods")
library("dplyr")
dir="all/"
all_fiels=list.files(path = dir ,pattern='*.xml$',recursive=T)
cl = lapply(all_fiels, function(x){
result <- xmlParse(file = file.path(dir,x))
rootnode <- xmlRoot(result)
xmldataframe <- xmlToDataFrame( rootnode[2] )
return(t(xmldataframe))
})
# 假设每个数据框中都有名为"patient_id"的列,可以根据这个列进行整合
# 如果列名不同,请将其更改为适当的列名
common_key <- "patient_id"
# 使用dplyr的full_join函数,根据共同的键(patient_id)将所有数据框合并在一起
clinical <- reduce(cl, function(df1, df2) full_join(df1, df2, by = common_key))
# 转置数据框
clinical <- t(clinical)
# 保存结果
write.table(clinical, file="clinical.txt", sep="\t", quote=F, row.names = F)
这个代码示例首先读取和解析所有的XML文件,然后使用dplyr库的full_join函数将它们根据一个共同的键(这里是"patient_id")进行整合。最后,将结果转置并保存到文件中。
检查下参数吧,参数的问题。