R 有没有办法在tbl中使用重塑?

R 有没有办法在tbl中使用重塑?,r,dataframe,dplyr,reshape,R,Dataframe,Dplyr,Reshape,在上一个问题中,我在使用“重塑”时遇到问题: 几个小时后,我意识到这是因为我使用的是tbl格式,而不是data.frame。因此,要使用重塑并保持tbl环境,我必须: mydata %>% as.data.frame %>% reshape(, ...) %>% as.tbl 所以我想知道是否还有其他的方法。 < P>更多的是有一个答案比其他任何原因,这里有四个选项要考虑。< /P> 首先,如果要将重塑与“dplyr”一起使用,则必须使用重塑中的new.row.names参

在上一个问题中,我在使用“重塑”时遇到问题:

几个小时后,我意识到这是因为我使用的是tbl格式,而不是data.frame。因此,要使用重塑并保持tbl环境,我必须:

mydata %>% as.data.frame %>% reshape(, ...) %>% as.tbl

所以我想知道是否还有其他的方法。

< P>更多的是有一个答案比其他任何原因,这里有四个选项要考虑。< /P> 首先,如果要将
重塑
与“dplyr”一起使用,则必须使用
重塑
中的
new.row.names
参数,并将它们设置为预期重塑后的数据集将具有的行数序列。计算起来很容易。取从宽格式到长格式的一批列的长度,乘以原始数据集中的行数

这种方法肯定会让哈德利因不满而坐立不安,因此使用这种方法的风险自负

mydf <- tbl_df(mydf)
class(mydf)
# [1] "tbl_df"     "tbl"        "data.frame"

mydf %>% 
  reshape(
    idvar="g_id",
    direction="long",
    varying=list(c(5:14),c(15:24)), 
    v.names=c("PLC","P"),
    new.row.names = seq_len(length(5:14) * nrow(mydf)))
在哈德利诗中,你可以尝试“tidyr”(如@DavidArenburg所建议的)。这并不像他想象的那么漂亮,因为它需要首先制作一个很长的数据集,然后再重新扩展它,不像上面的
melt
方法那样一步就完成了不长的重塑

library(tidyr)
mydf %>%
  gather(var, val, starts_with("P")) %>%
  mutate(var = gsub("([A-Z]+)", "\\1_", var)) %>%  ## you can probably be clever and...
  separate(var, into = c("variable", "time")) %>%  ## come up with some fancier regex
  spread(variable, val)
最后,还有我的“splitstackshape”包中的
merged.stack
。有了它,方法将是:

library(splitstackshape)
merged.stack(mydf, var.stubs = c("PLC", "P"), sep = "var.stubs")

重塑
相当缓慢且繁琐。您是否已退房
reformae2
套餐或
tidyr
?它们都应该正常工作。这个问题一定让哈德利感到不安。。。。
library(splitstackshape)
merged.stack(mydf, var.stubs = c("PLC", "P"), sep = "var.stubs")