将ddply翻译成dplyr和tidyr代码(mutate,unite,spread)

时间:2015-08-03 20:42:44

标签: r dplyr tidyr

我有以下数据集:

data <- data.frame(id = c(6,7,96,216,216,384),
               date = c("2003-03-27", "2003-03-31", "2001-08-01", "2009-05-26", "2009-05-26", "2001-04-05"),
               description = rep("code"),
               variable = rep("schedule"),
               value = c(388,45,95,390,12,10))

我正在尝试翻译一些使用plyr和reshape2的旧代码,而是使用dplyr和tidyr(旧代码需要永远运行)。

这是旧代码:

data$num <- as.numeric(0)
data1 <- ddply(data, .(id, date), transform, num = cumsum(num+1))
data2 <- within(data1, id2 <- interaction(variable, num))
data3 <- dcast(data2, id + date + description ~ id2)
data3

输出如下:

   id       date description schedule.1 schedule.2
1   6 2003-03-27        code        388         NA
2   7 2003-03-31        code         45         NA
3  96 2001-08-01        code         95         NA
4 216 2009-05-26        code        390         12
5 384 2001-04-05        code         10         NA

我没有在我的尝试中做得很远,我使用了group_by然后尝试使用num = cumsum(num + 1)变异一个新变量,但它只是对每一行1,2,3,4等进行编号。 / p>

我的第二个猜测是对id2变量使用unite,但这也不起作用。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:4)

使用dplyr/tidyr,我们按“ID”,“日期”分组,使用row_number() mutate创建'num'列,unite两列('变量'和'num)到一个列,并使用spread从'long'重新整形为'wide'格式。

library(dplyr)
library(tidyr)
data %>% 
   group_by(id, date) %>% 
   mutate(num=row_number()) %>% 
   unite(variable1, variable, num, sep=".") %>%
   spread(variable1, value)
#    id       date description schedule.1 schedule.2
#1   6 2003-03-27        code        388         NA
#2   7 2003-03-31        code         45         NA
#3  96 2001-08-01        code         95         NA
#4 216 2009-05-26        code        390         12
#5 384 2001-04-05        code         10         NA

或者我们可以使用dcast的devel版本中的data.table,即v1.9.5。通过对列进行分组来获取序列列的便捷功能是来自getanID的{​​{1}}。输出将是'data.table'。然后使用splitstackshape将“long”转换为“wide”格式。

dcast

注意:安装devel版本的说明是http://dojo.telerik.com/@ezanker/Ohino