fread() 与 read.csv() 的索引问题?
Indexing issue on fread() vs. read.csv()?
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
因此,使用这两种方法读取数据 return 相同类型的对象但对它们进行索引会给出不同的结果。为什么?我怎样才能使这些一致,以便选择使用 read.csv()
的用户不会得到与选择 fread()
的用户不同的结果?
P.S。这是我能找到的最接近的:read.csv and fread produce different results for the same data frame
但这与数据的读取方式有关。我找不到任何解决索引问题的方法。
read.csv()
returns一个data.frame
。当您为此 data.frame
执行 myInput[-3]
时,data.frame
被视为列表,并且索引删除列表的第三个元素,即第三列。
myInput <- read.csv(input_file, stringsAsFactors = FALSE)
class(myInput)
# [1] "data.frame"
fread()
returns一个data.table
。当您执行 myInput[-3]
时,这会删除 data.table
.
的第三行
myInput <- fread(input_file, stringsAsFactors = FALSE)
class(myInput)
# [1] "data.table" "data.frame"
这就是data.table
和data.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
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
因此,使用这两种方法读取数据 return 相同类型的对象但对它们进行索引会给出不同的结果。为什么?我怎样才能使这些一致,以便选择使用 read.csv()
的用户不会得到与选择 fread()
的用户不同的结果?
P.S。这是我能找到的最接近的:read.csv and fread produce different results for the same data frame
但这与数据的读取方式有关。我找不到任何解决索引问题的方法。
read.csv()
returns一个data.frame
。当您为此 data.frame
执行 myInput[-3]
时,data.frame
被视为列表,并且索引删除列表的第三个元素,即第三列。
myInput <- read.csv(input_file, stringsAsFactors = FALSE)
class(myInput)
# [1] "data.frame"
fread()
returns一个data.table
。当您执行 myInput[-3]
时,这会删除 data.table
.
myInput <- fread(input_file, stringsAsFactors = FALSE)
class(myInput)
# [1] "data.table" "data.frame"
这就是data.table
和data.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