/ / Проста функція не працює для `dcast` - reshape2 - r, переформатувати

Проста функція не працює для `dcast` - reshape2 - r, переформатувати

Припустимо, я маю ці дані:

 c1 c2 c3
A  A  AA
A  B  BB
A  C  CC
B  A  DD
B  B  EE
B  C  FF
C  A  GG
C  B  HH
C  C  II
A  A  JJ

Я хочу їх змінити dcast з цією функцією:

dcast(data,c1~c2,value.var="c3",function(x)x)

Але я отримую цю помилку:

Error in vapply(indices, fun, .default) : values must be length 0,
but FUN(X[[1]]) result is length 1

Як можна використовувати нову функцію за допомогою dcast (Функція, визначена користувачем).

Я хочу отримати:

  A   B   C
A AA BB  CC
B DD EE  FF
C GG HH  II
A JJ NA  NA

Відповіді:

7 для відповіді № 1

Ось можливе рішення з використанням data.tables v 1.9.5+ нові rleid функція, яка створить індекс для c1 стовпця (можна видалити indx згодом, якщо хочете)

library(data.table) # v 1.9.5+
dcast(setDT(stocksm)[, indx := rleid(c1)], indx + c1 ~ c2, value.var = "c3")
#    indx c1  A  B  C
# 1:    1  A AA BB CC
# 2:    2  B DD EE FF
# 3:    3  C GG HH II
# 4:    4  A JJ NA NA

### installing the development version
# library(devtools)
# install_github("Rdatatable/data.table", build_vignettes = FALSE)

Так в основному після створення індексу на c1 ми поширюємо дані більш-менш, як і раніше, включаючи indx всередині


Або якщо ви наполягаєте на цьому tidyr, ось варіант

library(tidyr)
stocksm$indx <- with(rle(as.character(stocksm$c1)), rep(seq_along(lengths), lengths))
spread(stocksm, c2, c3)
#   c1 indx  A    B    C
# 1  A    1 AA   BB   CC
# 2  A    4 JJ <NA> <NA>
# 3  B    2 DD   EE   FF
# 4  C    3 GG   HH   II

1 для відповіді № 2

Інший спосіб використання dcast це створити унікальні ідентифікатори за допомогою cumsum. Функція не буде знати, яке значення потрібно заповнити для таких дублікатів A A якщо це не створено.

data$ids <- cumsum(c(T,diff(as.numeric(data$c1)) != 0L))
dcast(data, ids+c1~c2, value.var="c3")[-1]
#   c1  A    B    C
# 1  A AA   BB   CC
# 2  B DD   EE   FF
# 3  C GG   HH   II
# 4  A JJ <NA> <NA>