R脚本将数据表格式化为精确的2位小数

R script to format datatable to exactly 2 decimal places

我做了一个数据table "Event_Table" 有 46 行和 6 列。在某些时候,我将其导出到文本文件,并希望某些字段的输出被截断到恰好 2 位小数。

Event_Table[1:34,3:6]=round(Event_Table[1:34,3:6])
Event_Table[36:39,3:6]=format(round(Event_Table[36:39,3:6],2), nsmall=2) 
Event_Table[41:46,3:6]=format(round(Event_Table[41:46,3:6],2), nsmall=2) 

第 1 行和第 2 行产生了预期的结果,但随后 运行 第 3 行抛出错误:

Error in Math.data.frame(list(CO = c("0", "0", "0.786407766990291", "0",  : 
non-numeric variable in data frame: CONCONATotal

为什么?如果删除第 2 行,则第 3 行运行正常。因此,在 table 的一部分中设置格式会影响整个 table 并阻止可能出现第二种格式命令形式(即使格式仅应用于 [=] 的离散部分51=]).有什么想法可以避免这种情况,或者以不同的方式达到要求吗?

编辑:

也许我应该补充一点,以下代码还不够:

Event_Table[36:46,3:6]=round(Event_Table[36:46,3:6], digits=2)

尾随零被截断。即值 1 显示为“1”,而不是“1.00”。后者是必需的。

编辑 2:

这里是 table:

ChrSize Chr CO  NCO NA  Total
1   230218  1   4.00    1.00    0   5.00
2   813184  2   6.00    6.00    0   12.00
3   316620  3   2.00    3.00    0   5.00
4   1531933 4   13.00   20.00   0   33.00
5   576874  5   3.00    8.00    0   11.00
6   270161  6   4.00    2.00    0   6.00
7   1090940 7   11.00   5.00    0   16.00
8   562643  8   5.00    9.00    0   14.00
9   439888  9   6.00    3.00    0   9.00
10  745751  10  10.00   6.00    0   16.00
11  666816  11  3.00    7.00    0   10.00
12  1078177 12  11.00   13.00   1   25.00
13  924431  13  7.00    12.00   0   19.00
14  784333  14  5.00    6.00    1   12.00
15  1091291 15  6.00    17.00   0   23.00
16  948066  16  7.00    6.00    0   13.00
17  12071326    TOTAL   103.00  124.00  2   229.00
18  NA  Event Lengths:  NA  NA  NA  NA
19  NA  Min Len 0.00    22.00   0   0.00
20  NA  Max Len 14745.00    12524.00    0   14745.00
21  NA  Mean Len    2588.00 1826.00 0   2153.00
22  NA  Median Len  1820.00 1029.00 0   1322.00
23  NA  Chromatids: NA  NA  NA  NA
24  NA  1_chrom 0.00    98.00   2   100.00
25  NA  2_chrom 81.00   22.00   0   103.00
26  NA  3_chrom 14.00   4.00    0   18.00
27  NA  4_chrom 8.00    0.00    0   8.00
28  NA  Classe: NA  NA  NA  NA
29  NA  1_1brin 0.00    55.00   0   55.00
30  NA  1_2brins    0.00    43.00   2   45.00
31  NA  2_nonsis    81.00   15.00   0   96.00
32  NA  2_sis   0.00    7.00    0   7.00
33  NA  classe_3    14.00   4.00    0   18.00
34  NA  classe_4    8.00    0.00    0   8.00
35  NA  Fraction of Chromatids: NA  NA  NA  NA
36  NA  1_chrom 0.00    0.79    1   0.44
37  NA  2_chrom 0.79    0.18    0   0.45
38  NA  3_chrom 0.14    0.03    0   0.08
39  NA  4_chrom 0.08    0.00    0   0.03
40  NA  Fraction of each Classe:    NA  NA  NA  NA
41  NA  1_1brin 0.00    0.44    0   0.24
42  NA  1_2brins    0.00    0.35    1   0.20
43  NA  2_nonsis    0.79    0.12    0   0.42
44  NA  2_sis   0.00    0.06    0   0.03
45  NA  classe_3    0.14    0.03    0   0.08
46  NA  classe_4    0.08    0.00    0   0.03

我要求第 1-34 行的格式不带小数。 并且第 36-46 行的格式为 所有 值的小数点后两位。

EDIT3:初始数据被顺序读入 tables 称为 "data",然后生成衍生输出 table "Event_Table",我在其中插入摘要每个 "data" table 的各个方面(即总数、平均值、中位数等)。然后我依次导出 "Event_Tables",因为它们包含每个 "data" table.

所需的摘要信息

这里是代码的开头:

# FIRST SET WORKING DIRECTORY WHERE INPUT FILES ARE!

files = list.files(pattern="Events_") # import files names with "Event_" string into variable "files" 
files1 = length(files) # Count number of files
files2 = read.table(text = files, sep = "_", as.is = TRUE) #Split file names by "_" separator and create table "files2"

for (j in 1:files1)
{data <- read.table(files[j], header=TRUE) #Import datatable from files number 1 to j

# Making derivative dataframes:
Event_Table <- data.frame(matrix(NA, nrow = 46, ncol = 6)) # Creates dataframe of arbitrary size full of NAs
names(Event_Table) <- c("ChrSize","Chr","CO","NCO","NA","Total") # Adds column names to dataframe
Event_Table ["Chr"] = c(1:16, "TOTAL","Event Lengths:","Min Len", "Max Len","Mean Len","Median Len","Chromatids:","1_chrom","2_chrom","3_chrom","4_chrom","Classe:","1_1brin","1_2brins","2_nonsis","2_sis","classe_3","classe_4","Fraction of Chromatids:","1_chrom","2_chrom","3_chrom","4_chrom","Fraction of each Classe:","1_1brin","1_2brins","2_nonsis","2_sis","classe_3","classe_4") #    Inserts vector 1:16 (numbers 1 to 16) in column 1 of dataframe
Event_Table [1:16,"ChrSize"] = c(230218,813184,316620,1531933,576874,270161,1090940,562643,439888,745751,666816,1078177,924431,784333,1091291,948066)
Event_Table [17,"ChrSize"] =sum(Event_Table [1:16,"ChrSize"])

nE = nrow(data) # Total number of events
Event_Table [17,"Total"] = nrow(data)
Event_Table [19,"Total"] = min(data ["len"])
Event_Table [20,"Total"] = max(data ["len"])
Event_Table [21,"Total"] = mean(data ["len"])
Event_Table [22,"Total"] = median(data [1:nrow(data),"len"])

#More stuff here, etc, then close j loop }

因此 Event_Table 被设置为 data.frame 类型的矩阵,其中填充了 NA。 然后我在相关网格位置手动填充相关信息。 然后我只想格式化这些字段的视觉外观。

如果我做的全错了,那么请你提出一个更好的方法来做这件事!谢谢

这可能是与 Error in Math.data.frame.....non-numeric variable in data frame: 类似的问题。也许您的数据中有逗号。如果不是这样,你能展示一下你的 table 里有什么吗?

这是使用 2 个相当不同的数据框的概念证明:

DF1 <- data.frame(x = rnorm(10), person = rep(LETTERS[1:2], 5))
DF2 <- data.frame(y = 1:10L, result = rep(LETTERS[3:4], 5), alt = rep(letters[3:4], 5))
write.table(DF1, file = "example.csv", sep = ",")
write.table(DF2, file = "example.csv", sep = ",", append = TRUE)

这会发出警告(关于列名 - 没问题)并给出:

x   person      
1   0.796933543 A   
2   1.495800567 B   
3   0.359153458 A   
4   2.105378598 B   
5   0.175455314 A   
6   -1.850171347    B   
7   -0.87197177 A   
8   2.682650638 B   
9   1.040676847 A   
10  -0.086197042    B   
y   result  alt 
1   1   C   c
2   2   D   d
3   3   C   c
4   4   D   d
5   5   C   c
6   6   D   d
7   7   C   c
8   8   D   d
9   9   C   c
10  10  D   d

在这里您可以根据需要控制格式。您可能希望隐藏列名称或提供更多信息,并且您可能也不希望行编号。请参阅 ?write.table 了解所有选项。