如何阅读 csv。 data.table 包中包含向量的文件?

How to read csv. files with vectors in data.table package?

我创建了一个小标题(名为 df),里面有一个数字和一个向量:

library(tsibble)
library(data.table)

df <- tibble(var1 = 5, var2 = list(c(1,2,3)))

var1   var2
 5   c(1,2,3)

然后我将这个标题保存为 csv。像这样的文件:

data.table::fwrite(df, file = "C/MyFolder/file.csv")

现在我想阅读这个文件:

df <- data.table::fread(file = "C/MyFolder/file.csv")

然后我在一个单元格中得到了带有数字和文本的新标题:

 var1   var2
   5    1|2|3

如何正确读取csv。文件以便再次获得单元格内带有矢量的小标题?

您的 csv 文件似乎由 | 分隔,因此您需要在 fread 中使用如下分隔符参数:

fread(file = "file.csv", sep="|")

问候

您可能无法一蹴而就,但这里有一个自定义函数可以解决您的问题。

自定义函数

函数str_as_vct()定义如下:

str_as_vct <- function(x, sep = "|", transform = as.numeric, ...) {
  sapply(
    X = base::strsplit(
      x = x,
      split = sep,
      fixed = TRUE
    ),
    FUN = transform,
    ... = ...,
    simplify = FALSE,
    USE.NAMES = FALSE
  )
}

描述

获取一个包含 character 个字符串的向量,每个字符串的值都由分隔符分隔,然后将每个字符串拆分为其值的向量。

用法

xcharacter 个字符串的向量,将向量表示为分隔值。

sep:一个character字符串。 x.

中字符串使用的分隔符

transform:将 character 向量转换为所需数据类型的向量的函数。

...transform 函数的进一步参数。

解决方案

有了 str_as_vct(),您的问题可以在一次作业中解决:

df <- data.table::fread(file = "C/MyFolder/file.csv")[
  # Select all rows.
  ,
  
  # Select and transform columns.
  .(var1, var2 = str_as_vct(var2))
]

结果

给定初始 df 像这样

df <- tibble(
  var1 = 1:3,
  var2 = list(
    c(1, 2, 3),
    c(4, 5, 6),
    c(7, 8, 9)
  )
)

该解决方案应产生 data.table 并具有以下 str()

Classes ‘data.table’ and 'data.frame':  3 obs. of  2 variables:
 $ var1: int  1 2 3
 $ var2:List of 3
  ..$ : num  1 2 3
  ..$ : num  4 5 6
  ..$ : num  7 8 9
 - attr(*, ".internal.selfref")=<externalptr> 

其中 var2 的每个元素都是一个 numeric 向量。

通过 as_tibble(df) 转换为 tibble 将产生:

# A tibble: 3 x 2
   var1 var2     
  <int> <list>   
1     1 <dbl [3]>
2     2 <dbl [3]>
3     3 <dbl [3]>