简单功能不适用于 `dcast` - reshape2
Simple function does not work for `dcast` - reshape2
假设我有这个数据:
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
这是一个使用 data.table
s 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
另一种使用 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>
假设我有这个数据:
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
这是一个使用 data.table
s 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
另一种使用 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>