如何避免R语言中DataFrame首列插入无表头数字列?
解决R中write.table输出多余行号与引号问题
问题场景
处理如下格式的文件(file1.txt):
number variant_id gene_id tss_distance ma_samples ma_count maf pval_nominal slope slope_se hg38_chr hg38_pos ref_allele alt_allele hg19_chr hg19_pos ID new_MAF CHROM POS REF ALT A1 OBS_CT BETA SE P SD Variance 6253443 chr1_17726150_G_A_b38 ENSG00000272426.1 821374 68 78 0.0644628 0.764314 -0.0320846 0.106958 chr1 17726150 G A chr1 18052645 rs260514:18052645:G:A 0.058155 1 18052645 G A G 1597 0.0147047 0.0656528 0.822804 2.62364886486368 6.88353336610048 6253444 chr1_17726150_G_A_b38 ENSG00000117118.9 671980 68 78 0.0644628 0.955989 -0.00275742 0.0499406 chr1 17726150 G A chr1 18052645 rs260514:18052645:G:A 0.058155 1 18052645 G A G 1597 0.0147047 0.0656528 0.822804 2.62364886486368 6.88353336610048
执行以下代码删除首列number后:
Data <- read.table("/filepath_to_file/file1.txt", header = TRUE) Data <- subset(Data, select = -number) write.table(Data, "/filepath_to_file/file2.txt")
输出的file2.txt会多出无表头的行号列,且部分内容带引号,导致列名与值错位:
"variant_id" "gene_id" "tss_distance" "ma_samples" "ma_count" "maf" "pval_nominal" "slope" "slope_se" "hg38_chr" "hg38_pos" "ref_allele" "alt_allele" "hg19_chr" "hg19_pos" "ID" "new_MAF" "CHROM" "POS" "REF" "ALT" "A1" "OBS_CT" "BETA" "SE" "P" "SD" "Variance" "1" "chr1_17726150_G_A_b38" "ENSG00000272426.1" 821374 68 78 0.0644628 0.764314 -0.0320846 0.106958 "chr1" 17726150 "G" "A" "chr1" 18052645 "rs260514:18052645:G:A" 0.058155 1 18052645 "G" "A" "G" 1597 0.0147047 0.0656528 0.822804 2.62364886486368 6.88353336610048 "2" "chr1_17726150_G_A_b38" "ENSG00000117118.9" 671980 68 78 0.0644628 0.955989 -0.00275742 0.0499406 "chr1" 17726150 "G" "A" "chr1" 18052645 "rs260514:18052645:G:A" 0.058155 1 18052645 "G" "A" "G" 1597 0.0147047 0.0656528 0.822804 2.62364886486368 6.88353336610048
期望输出格式为:
variant_id gene_id tss_distance ma_samples ma_count maf pval_nominal slope slope_se hg38_chr hg38_pos ref_allele alt_allele hg19_chr hg19_pos ID new_MAF CHROM POS REF ALT A1 OBS_CT BETA SE P SD Variance chr1_17726150_G_A_b38 ENSG00000272426.1 821374 68 78 0.0644628 0.764314 -0.0320846 0.106958 chr1 17726150 G A chr1 18052645 rs260514:18052645:G:A 0.058155 1 18052645 G A G 1597 0.0147047 0.0656528 0.822804 2.62364886486368 6.88353336610048 chr1_17726150_G_A_b38 ENSG00000117118.9 671980 68 78 0.0644628 0.955989 -0.00275742 chr1 17726150 G A chr1 18052645 rs260514:18052645:G:A 0.058155 1 18052645 G A G 1597 0.0147047 0.0656528 0.822804 2.62364886486368 6.88353336610048
原因分析
write.table()函数默认参数中:
row.names=TRUE:会把数据框的行名(默认是1、2、3...)输出为新的首列quote=TRUE:会给字符型列的内容和列名添加双引号
这两个默认行为导致了输出格式不符合预期。
解决方案
方法1:修改write.table的参数
直接在write.table()中设置row.names=FALSE和quote=FALSE,同时指定sep=" "确保列之间用空格分隔(和原文件一致):
Data <- read.table("/filepath_to_file/file1.txt", header = TRUE) Data <- subset(Data, select = -number) write.table(Data, "/filepath_to_file/file2.txt", row.names = FALSE, quote = FALSE, sep = " ")
方法2:用dplyr简化列删除操作(可选)
如果习惯用dplyr包,可用select()函数删除列,代码更简洁:
library(dplyr) Data <- read.table("/filepath_to_file/file1.txt", header = TRUE) %>% select(-number) write.table(Data, "/filepath_to_file/file2.txt", row.names = FALSE, quote = FALSE, sep = " ")
方法3:用data.table快速读写(大文件推荐)
如果处理大文件,data.table包的fread()和fwrite()效率更高,且默认不输出行名和引号:
library(data.table) Data <- fread("/filepath_to_file/file1.txt") Data <- Data[, !"number"] fwrite(Data, "/filepath_to_file/file2.txt", sep = " ")
以上方法都能得到符合预期的输出格式,解决行号和引号问题。
内容的提问来源于stack exchange,提问作者HKJ3
相关产品推荐
相关产品推荐

