Проблема не в размере самого набора данных, а в появлении дублированных записей в полном наборе данных.При выборе меньших подмножеств из полного набора данных существует вероятность того, что дубликаты не будут включены.
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