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

时间:2016-01-21 17:54:43

标签: r dataframe dplyr reshape

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

reshape error - invalid 'row.names' length

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

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

所以我想知道是否有另一种方法可以这样做。

1 个答案:

答案 0 :(得分:1)

除了任何其他原因之外,还有其他答案,这里有四个选项需要考虑。

首先,如果您想使用reshape以及" dplyr",您必须使用new.row.names中的reshape参数,并将它们设置为您希望重新整形的数据集具有的行数的序列。计算很简单。获取从宽格式到长格式的一批列的长度,并将其乘以原始数据集中的行数。

这种做法肯定会让哈德利感到不安,所以请自担风险。

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)))

另一种方法可能会让Hadley蠕动,但会少一点,就是使用melt,但来自&#34; data.table&#34;的melt,而不是来自&# 34; reshape2&#34 ;.当然,这会要求您将tbl_df转换为data.table,这与您当前的方法类似,需要采取另一个步骤。

library(data.table)
mydf %>%
  data.table %>%
  melt(measure.vars = patterns("PLC[0-9]+", "P[0-9]+"), 
       value.name = c("PLC", "P"))

在Hadleyverse内,您可以尝试&#34; tidyr&#34; (正如@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)

最后,我的&#34; splitstackshape&#34;还有merged.stack。包。有了它,方法就像:

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