Проблема с индексированием для fread () или read.csv ()? - PullRequest
1 голос
/ 14 апреля 2020
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

Таким образом, чтение данных с использованием этих 2 методов возвращает объекты одного типа но индексирование по ним дает разные результаты. Почему? И как я могу сделать так, чтобы пользователи, которые решили использовать read.csv(), не получали разные результаты от пользователей, которые выбирают fread()?

PS. Это самое близкое, что я мог найти: чтение .csv и fread дают разные результаты для одного и того же фрейма данных

Но это связано с тем, как считываются данные. Я не смог найти ничего, что решило бы проблему индексации.

1 Ответ

0 голосов
/ 15 апреля 2020

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.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
...