如何阅读 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
个字符串的向量,每个字符串的值都由分隔符分隔,然后将每个字符串拆分为其值的向量。
用法
x
:character
个字符串的向量,将向量表示为分隔值。
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]>
我创建了一个小标题(名为 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
个字符串的向量,每个字符串的值都由分隔符分隔,然后将每个字符串拆分为其值的向量。
用法
x
:character
个字符串的向量,将向量表示为分隔值。
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]>