dcast не может привести символьный столбец, когда размер данных большой - PullRequest
0 голосов
/ 16 сентября 2018

Я использую функцию dcast в пакете library(reshape2) для приведения простой таблицы из трех столбцов

df = data.table(id  = 1:1e6, 
             var = c('continent','subcontinent',...), 
             val = c('America','Caribbean',...)````

к dcast(df, id ~ var, value.var ='val'), и она автоматически преобразует значение в число, т.е.

id     continent   subcontinent
 1     1           1
 2     1           1

Однако, если я уменьшу размер до 10000 строк, он правильно выведет

id     continent   subcontinent
 1     America     Caribbean
 2     Europe      West Europe

Это ошибка или мне нужно как-то изменить код?Пожалуйста помоги.Спасибо!

Ответы [ 3 ]

0 голосов
/ 16 сентября 2018

Вероятно, это вызвано дублированием записей.

Так что в вашем подмножестве возможно непреднамеренное удаление повторяющихся записей строк.

Вывод с использованием DF с повторяющимися записями

df = data.table(id  = c(1,2,3,4,2), 
                var = c('continent','subcontinent','continent','continent','subcontinent'), 
                val = c('America','Caribbean','Africa','Europe','Caribbean'))

dcast(df, id ~ var, value.var ='val')

Aggregate function missing, defaulting to 'length'
   id continent subcontinent
1:  1         1            0
2:  2         0            2
3:  3         1            0
4:  4         1            0

Попробуйте уникальный ()

Если дубликаты не важны, возможно, стоит:

dcast(unique(df), id ~ var, value.var ='val')

   id continent subcontinent
1:  1   America           NA
2:  2        NA    Caribbean
3:  3    Africa           NA
4:  4    Europe           NA 
0 голосов
/ 18 сентября 2018

Проблема не в размере самого набора данных, а в появлении дублированных записей в полном наборе данных.При выборе меньших подмножеств из полного набора данных существует вероятность того, что дубликаты не будут включены.

help("dcast", "data.table") говорит:

Когда комбинации переменных в formula не идентифицируютв ячейке должно быть указано уникальное значение, fun.aggregate, которое по умолчанию равно length, если не указано.

Как найти дубликаты в полном наборе данных

Все вхождения дубликатов можно идентифицировать по

cols <- c("id", "var")
df[duplicated(df, by = cols) | duplicated(df, by = cols, fromLast = TRUE)][
  order(id)]
   id          var           val
1:  1 subcontinent     Caribbean
2:  1 subcontinent South America

Примечаниечто мы ищем дубликаты в id и var, поскольку эти два формируют ячейки , то есть строки и столбцы измененного результата.

Почему unique() не работает

Примечание: это объяснение, почему простое взятие unique(df) не будет работать:

unique(df)
   id          var           val
1:  1    continent       America
2:  1 subcontinent     Caribbean
3:  2    continent        Europe
4:  2 subcontinent   West Europe
5:  1 subcontinent South America

не удаляет строки.Следовательно,

dcast(unique(df), id ~ var, value.var = "val")
Aggregate function missing, defaulting to 'length'
   id continent subcontinent
1:  1         1            2
2:  2         1            1

Принимая во внимание, что

unique(df, by = cols)
   id          var         val
1:  1    continent     America
2:  1 subcontinent   Caribbean
3:  2    continent      Europe
4:  2 subcontinent West Europe

удалил дубликат var для id == 1L,Следовательно,

dcast(unique(df, by = cols), id ~ var, value.var = "val")
   id continent subcontinent
1:  1   America    Caribbean
2:  2    Europe  West Europe

Как найти номера строк повторяющихся строк

ОП сообщила, что проблема возникает только с полным набором данных, но нес подмножеством первых 1e5 строк.

Индексы строк повторяющихся записей можно найти по

which(duplicated(df, by = cols))

, который возвращает 5 для образца набора данных.Для полного набора данных OP, я подозреваю, что

min(which(duplicated(df, by = cols))) > 1e5

имеет значение true, т. Е. В первых 1e5 строках нет дубликатов.

Как создавать символьные столбцы даже в случае повторяющихся записей

Собственный подход OP с использованием fun.aggregate = function(x) paste(x[1L]), а также применение unique() к df просто нацелено на удаление любых мешающих дубликатов.Дубликаты будут отбрасываться без вывода сообщений.

В качестве альтернативы, toString() может использоваться в качестве функции агрегирования, которая отображает повторяющиеся записи:

dcast(df, id ~ var, toString, value.var = "val")
   id continent             subcontinent
1:  1   America Caribbean, South America
2:  2    Europe              West Europe

Данные

library(data.table)
df <- data.table(
  id  = c(1L, 1L, 2L, 2L, 1L),
  var = c("continent", "subcontinent", "continent", "subcontinent", "subcontinent"),
  val = c("America", "Caribbean", "Europe", "West Europe", "South America")
)

df
   id          var           val
1:  1    continent       America
2:  1 subcontinent     Caribbean
3:  2    continent        Europe
4:  2 subcontinent   West Europe
5:  1 subcontinent South America
0 голосов
/ 16 сентября 2018

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

dcast(df, id ~ var, value.var ='val', fun.aggregate =function(x) paste(x[1])

...