将data.frame与自身绑定时,不会创建精确的副本

将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

我有这个数据帧结构

数据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)
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)
}