fread()与read.csv()的索引问题?

问题描述 投票:1回答:1
myInput <- data.frame('X' = c(1, 2, 3, 4, 5), 
                      'n' = c(87, 119, 94, 95, 134),
                      'r' = c(76, 8, 74, 11, 0))

write.csv(myInput, file = "test.csv", row.names = FALSE)

input_file <- "test.csv"

#Load input
myInput <- read.csv(input_file, stringsAsFactors = FALSE)
a_csv <- myInput[-3]
b_csv <- myInput[,-3] 

给出此:

> print(dim(a_csv))
[1] 5 2
> print(dim(b_csv))
[1] 5 2

与此结果与fread()相比:

myInput <- fread(input_file, stringsAsFactors = FALSE)
a_fread <- myInput[-3] 
b_fread <- myInput[,-3]

> print(dim(a_fread))
[1] 4 3
> print(dim(b_fread))
[1] 5 2

因此,使用这两种方法读取数据将返回相同类型的对象,但对其进行索引将得到不同的结果。为什么?以及如何使它们保持一致,以使选择使用read.csv()的用户不会与选择fread()的用户获得不同的结果?

P.S。这是我能找到的最接近的:read.csv and fread produce different results for the same data frame

但是它与如何读取数据有关。我找不到解决索引问题的任何东西。

r data.table read.csv
1个回答
0
投票

read.csv()返回data.frame。当对此myInput[-3]执行data.frame时,data.frame被视为一个列表,而索引将删除该列表的第三个元素,即第三列。

myInput <- read.csv(input_file, stringsAsFactors = FALSE)
class(myInput)
# [1] "data.frame"

fread()返回data.table。当您执行myInput[-3]时,它将删除data.table的第三行。

myInput <- fread(input_file, stringsAsFactors = FALSE)
class(myInput)
# [1] "data.table" "data.frame"

这只是data.tabledata.frame不同的方式。从技术上讲,这是[.data.table[.data.frame之间的区别。

示例:

DT <- data.table(a = 1:4, b = letters[1:4], c = LETTERS[1:4])
DT
#    a b c
# 1: 1 a A
# 2: 2 b B
# 3: 3 c C
# 4: 4 d D
DT[-3]
#    a b c
# 1: 1 a A
# 2: 2 b B
# 3: 4 d D
df <- data.frame(a = 1:4, b = letters[1:4], c = LETTERS[1:4])
df
#   a b c
# 1 1 a A
# 2 2 b B
# 3 3 c C
# 4 4 d D
df[-3]
#   a b
# 1 1 a
# 2 2 b
# 3 3 c
# 4 4 d
© www.soinside.com 2019 - 2024. All rights reserved.