如何用write.table将数据框列名设为文件首行?
问题
需要生成符合NormalyzerDE要求的输入文件,格式要求首行为表头(第一列是标识符,后续为样本列名),数据行依次是标识符和对应数值,示例如下:
pepseq s1 s2 s3 s4 ATAAGG 20.0 21.2 19.4 18.5 AWAG 23.3 24.1 23.5 17.3 ACATGM 22.1 22.3 22.5 23.2
当前使用以下代码保存数据:
write.table(mat, "processed_data.csv", sep="\t", row.names=T, quote=F, col.names=F)
用指定代码读取后:
rawData <- as.matrix(utils::read.table("processed_data.csv", header=FALSE, sep="\t", stringsAsFactors=FALSE, quote="", comment.char=""))
rawData中缺失mat的列名,不符合预期格式。
输入的mat前10行数据:
> dput(mat[1:10,]) structure(c(0.772169167803547, 0.796725784447476, 0.260572987721692, 0.506139154160982, 0.433833560709413, 0.489768076398363, 0.424283765347885, 0.338335607094134, 0.448840381991814, 0.489768076398363, 0.612625538020086, 0.466284074605452, 0.246771879483501, 0.436154949784792, 0.39454806312769, 0.36154949784792, 0.327116212338594, 0.340028694404591, 0.341463414634146, 0.671449067431851, 0.350267379679144, 0.588235294117647, 0.31951871657754, 0.378342245989305, 0.371657754010695, 0.372994652406417, 0.31951871657754, 0.438502673796791, 0.322192513368984, 0.512032085561497, 0.802600472813239, 0.540189125295508, 0.340425531914893, 0.572104018912529, 0.358156028368794, 0.434988179669031, 0.51063829787234, 0.540189125295508, 0.494089834515366, 0.567375886524823, 0.468937875751503, 0.7374749498998, 0.258517034068136, 0.442885771543086, 0.420841683366733, 0.338677354709419, 0.322645290581162, 0.336673346693387, 0.318637274549098, 0.739478957915832, 0.795880149812734, 0.552434456928839, 0.254681647940075, 0.51685393258427, 0.451310861423221, 0.434456928838951, 0.49438202247191, 0.552434456928839, 0.49063670411985, 0.524344569288389, 0.936073059360731, 0.640791476407915, 0.277016742770167, 0.4779299847793, 0.388127853881279, 0.410958904109589, 0.410958904109589, 0.372907153729072, 0.432267884322679, 0.605783866057839, 0.404309252217998, 0.482889733840304, 0.129277566539924, 0.367553865652725, 0.160963244613435, 0.311787072243346, 0.220532319391635, 0.280101394169835, 0.228136882129278, 0.38276299112801), dim = c(10L, 8L), dimnames = list(c("AAAS", "AAK1", "AAMDC", "AARS", "AASDHPPT", "ABCD3", "ABCE1", "ABCF1", "ABHD10", "ABI1"), c("C_1", "C_2", "C_3", "C_4", "D_5", "D_6", "D_7", "D_8")))
读取后得到的rawData前10行:
> dput(rawData[1:10,]) structure(c("AAAS", "AAK1", "AAMDC", "AARS", "AASDHPPT", "ABCD3", "ABCE1", "ABCF1", "ABHD10", "ABI1", "0.7721692", "0.7967258", "0.2605730", "0.5061392", "0.4338336", "0.4897681", "0.4242838", "0.3383356", "0.4488404", "0.4897681", "0.61262554", "0.46628407", "0.24677188", "0.43615495", "0.39454806", "0.36154950", "0.32711621", "0.34002869", "0.34146341", "0.67144907", "0.35026738", "0.58823529", "0.31951872", "0.37834225", "0.37165775", "0.37299465", "0.31951872", "0.43850267", "0.32219251", "0.51203209", "0.80260047", "0.54018913", "0.34042553", "0.57210402", "0.35815603", "0.43498818", "0.51063830", "0.54018913", "0.49408983", "0.56737589", "0.468937876", "0.737474950", "0.258517034", "0.442885772", "0.420841683", "0.338677355", "0.322645291", "0.336673347", "0.318637275", "0.739478958", "0.79588015", "0.55243446", "0.25468165", "0.51685393", "0.45131086", "0.43445693", "0.49438202", "0.55243446", "0.49063670", "0.52434457", "0.93607306", "0.64079148", "0.27701674", "0.47792998", "0.38812785", "0.41095890", "0.41095890", "0.37290715", "0.43226788", "0.60578387", "0.40430925", "0.48288973", "0.12927757", "0.36755387", "0.16096324", "0.31178707", "0.22053232", "0.28010139", "0.22813688", "0.38276299"), dim = 10:9, dimnames = list( NULL, c("V1", "V2", "V3", "V4", "V5", "V6", "V7", "V8", "V9" )))
解决方案
问题出在保存数据时没有输出列名,且未给第一列(标识符列)设置表头。修改保存代码如下:
# 将行名转为第一列,并保留原列名 df_formatted <- cbind(gene_id = rownames(mat), as.data.frame(mat)) # 保存为符合要求的格式:首行是表头,无额外行名 write.table(df_formatted, "processed_data.csv", sep="\t", row.names=FALSE, quote=FALSE)
用原读取代码读取后,rawData的第一行即为表头(包含gene_id和样本列名C_1、C_2等),后续行是标识符和对应数据,完全符合要求的输入格式。
说明
原代码中col.names=F导致未输出样本列名,row.names=T仅输出行名作为第一列内容,但没有表头行。修改后的代码将行名整合为数据框的第一列,并通过row.names=F、col.names=T输出完整的表头行,完美匹配NormalyzerDE的输入要求。
内容的提问来源于stack exchange,提问作者Anon
相关产品推荐
相关产品推荐

