简单的功能不适用于`dcast` - reshape2

use*_*187 1 r reshape

假设我有这些数据:

 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
Run Code Online (Sandbox Code Playgroud)

我想dcast用这个函数重塑它们:

dcast(data,c1~c2,value.var="c3",function(x)x)
Run Code Online (Sandbox Code Playgroud)

但我得到这个错误:

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

如何使用新功能dcast(用户定义的功能).

我想得到:

  A   B   C
A AA BB  CC
B DD EE  FF
C GG HH  II
A JJ NA  NA
Run Code Online (Sandbox Code Playgroud)

Dav*_*urg 7

这是一个使用data.tablesv 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)
Run Code Online (Sandbox Code Playgroud)

所以基本上在创建索引之后,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
Run Code Online (Sandbox Code Playgroud)