将数据导出到具有每列不同数据类型的csv

时间:2019-10-30 07:25:51

标签: r excel csv data.table

我需要为同事提供一个csv,他们可以在Excel中轻松使用它。 CSV的不同部分存储在不同的data.tables中,因为它们的结构不同。 现在出现了问题,每当我想将data.tables导出到一个csv中时,将具有数字和字符串值的列的数据类型设置为chr,这当然会在Excel中使用数字产生问题。 (还请注意,这个问题要严重得多,因为它是德国,而我们使用的是另一个小数点分隔符。)我认为这是由于大多数导出工具fwritewrite.csv,首先rbind将data.tables合并为一个,然后将其导出。 有没有一种方法可以创建一个可以在一个列中存储不同data.type的csv?目前,我存储每个csv文件的每个data.table,但因此我正在创建手动工作,而我不希望这样做。

一个最小的最小工作示例:

library(data.table)

dt.a <- data.table(D = letters[12:22]
                      , E = seq(from = 10, to = 11, by = 0.1)
                      )


dt.b <- data.table(A = seq(from = 1, to =2, by = 0.1)
                        , B = letters[1:11]
                        )

fwrite(x = rbind(dt.b
       , dt.a
       , use.names = FALSE)
       , file = "test.csv"
       , sep = ";"
       , dec = ","
       , col.names = FALSE 
       , row.names = FALSE
)

这将导致如下所示的csv文件,并且可以看出,数字的格式不容易在Excel中导入。

1;a
1.1;b
1.2;c
1.3;d
1.4;e
1.5;f
1.6;g
1.7;h
1.8;i
1.9;j
2;k
l;10
m;10.1
n;10.2

1 个答案:

答案 0 :(得分:0)

这个问题的答案是否定的:

  

有没有一种方法可以创建一个可以在一个列中存储不同data.type的csv?

列是向量,仅由一种类型/类组成。您可以创建列表列,即列表列,因此可以包含异构元素,但是我认为这不能很好地转换为Excel表。

您的选择是:

  1. 为每个数据表创建多个CSV,
  2. 使用cbind(dt.a, dt.b)按列而不是按行绑定data.tables
  3. ,或仅使用writexl库将多张工作表直接导出到XLSX。这可能是您最好的选择。尝试这样的事情:
writexl::write_xlsx(list(dt_a = dt.a, dt_b = dt.b), "test.xlsx")

输出是XLSX,其中有两张纸分别对应于您的两个data.tables。

我可能应该提到writexl开发人员在文档中包含了一个(运行异常)的Clippy。我个人认为这很有趣,但是很多人very annoyed

enter image description here