将data.frame与自身绑定时,不会创建精确的副本
我有这个数据帧结构 数据1:将data.frame与自身绑定时,不会创建精确的副本,r,dataframe,R,Dataframe,我有这个数据帧结构 数据1: SNP logp Allele rs2929 rs333003 4.46411719154375 T rs3491 rs405831 4.46411719154375 G rs1224 rs179639 4.44797917307381 A 和Data2假设它是相同的(只是为了测试Data1) 当我这样做时: f1=read.table(data1, header=TRUE ,as.is=TRUE) f
SNP logp Allele
rs2929 rs333003 4.46411719154375 T
rs3491 rs405831 4.46411719154375 G
rs1224 rs179639 4.44797917307381 A
和Data2假设它是相同的(只是为了测试Data1)
当我这样做时:
f1=read.table(data1, header=TRUE ,as.is=TRUE)
f3=rbind(f1,f1)
我得到这个结果??:
SNP logp Allele
rs2929 rs333003 4.46411719154375 T
rs3491 rs405831 4.46411719154375 G
rs1224 rs179639 4.44797917307381 A
rs29291 rs333003 4.46411719154375 T
rs34911 rs405831 4.46411719154375 G
rs12241 rs179639 4.44797917307381 A
您可以看到的问题是rs2929应该被复制两次,但是它将是RS291。请注意,字符串中所有的重复项都是+“1”?那是错的!?我怎样才能把它变成:
SNP logp Allele
rs2929 rs333003 4.46411719154375 T
rs3491 rs405831 4.46411719154375 G
rs1224 rs179639 4.44797917307381 A
rs2929 rs333003 4.46411719154375 T
rs3491 rs405831 4.46411719154375 G
rs1224 rs179639 4.44797917307381 A
因为这是真正的“合并”,我想加入2个文件。
我知道这听起来很奇怪,因为我在复制值,但如果发生这种情况,那就是我想要的 从
读取.表格
:
row.names[…]
因此,在您的示例中,第一列用作行名,并且由于R要求行名始终是唯一的,因此当您尝试创建重复项时,它会附加这些1
一种解决方案是在文件的左上角单元格中添加列名,或使用row.names=NULL调用read.table:
f1 <- read.table(textConnection("
SNP logp Allele
rs2929 rs333003 4.46411719154375 T
rs3491 rs405831 4.46411719154375 G
rs1224 rs179639 4.44797917307381 A
"), header = TRUE, as.is = TRUE, row.names = NULL)
rbind(f1, f1)
# row.names SNP logp Allele
# 1 rs2929 rs333003 4.464117 T
# 2 rs3491 rs405831 4.464117 G
# 3 rs1224 rs179639 4.447979 A
# 4 rs2929 rs333003 4.464117 T
# 5 rs3491 rs405831 4.464117 G
# 6 rs1224 rs179639 4.447979 A
f1最左边的字符串(“rs2929”等)是行名。R希望对象中的名称是明确的,这是有充分理由的,所以它重新分配了一些名称。最简单的解决方案可能是不将此信息存储在行名中,而是存储在普通列中
f1$rs <- rownames(f1)
rownames(f1) <- NULL
f1new <- rbind(f1,f1)
f1$rs第一列缺少列标签意味着它们被解释为行标签,而不是数据
见此:
f1 <- structure(list(X = c("rs2929", "rs3491", "rs1224"), SNP = c("rs333003",
"rs405831", "rs179639"), logp = c(4.46411719154375, 4.46411719154375,
4.44797917307381), Allele = c("T", "G", "A")), .Names = c("X",
"SNP", "logp", "Allele"), class = "data.frame", row.names = c(NA, -3L))
rbind(f1,f1)
f1所以我想出了我需要的这个函数:
merge_gwas("final.txt","file1.txt","file2.txt")
merge_gwas<-function (out,a1,a2){
f1=read.table(a1,header=T,as.is=TRUE)
f2=read.table(a2,header=T,as.is=TRUE)
f3<- rbind(f1,f2)
write.table(f3, out,quote = FALSE, sep="\t", row.names = FALSE)
}
merge\u gwas(“final.txt”、“file1.txt”、“file2.txt”)
合并\u gwas。。。并不是说merge
可以帮助你解决问题,而是帮助你意识到你误用了这个动词,因为它在R中的含义完全不同。@Miguel,我不得不回滚你对问题和我的答案所做的编辑。每个人的答案都是基于这样一个事实,即头的字段名比文件中的列数少一个。没有它,每个人的答案都毫无意义。请保持一切原样,没问题。缺少列标签吗?但是我有所有的标题标签!?请在文章的开头检查。您的“Data1”有4列和3组列名。但是如何删除ID为的第一列?因为我想把它导出为一个新文件。。。而且格式必须与data1结构完全相同。另外,为什么它需要唯一?因为我显示的数据只是它的一部分,但实际上文件本身在rs2929上有重复,甚至数据帧能够读取并使用它?所以,我不明白这可能是一个非常简单的操作,毕竟,我只想将文件a和文件b组合在一起,以相同的格式,它只是出现在行中。如果第一列具有非唯一值,则不能将其用作data.frame的row.names,所以请将其视为任何其他列。要做到这一点,如果你想使用read.table
,你需要在该列中有一个标题,也就是说,你需要在文件的左上角写一些东西。如果你对文件格式不灵活,并且需要将左上角的单元格保留为空,我看不出你可以使用read.table
。相反,例如,您必须使用scan
编写自己的I/O函数,这会有点麻烦。假设您在文件的左上角单元格中输入了一个名称,代码将如下所示:f1
merge_gwas("final.txt","file1.txt","file2.txt")
merge_gwas<-function (out,a1,a2){
f1=read.table(a1,header=T,as.is=TRUE)
f2=read.table(a2,header=T,as.is=TRUE)
f3<- rbind(f1,f2)
write.table(f3, out,quote = FALSE, sep="\t", row.names = FALSE)
}