【问题标题】:Translating ddply to dplyr and tidyr code (mutate, unite, spread)将 ddply 翻译成 dplyr 和 tidyr 代码(变异、联合、传播)
【发布时间】:2015-10-26 02:22:25
【问题描述】:

我有以下数据集:

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 等。

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

任何帮助将不胜感激!

【问题讨论】:

  • 鉴于您的输入数据框,您的输出没有多大意义。你确定这正是你得到的,而不仅仅是一般结构的例子吗?
  • @joran 现在应该是正确的......我在原始帖子后大约 2 分钟进行了编辑以修复错误。

标签: r dplyr tidyr


【解决方案1】:

使用dplyr/tidyr,我们按'id'、'date'分组,将'num'列创建为row_number()mutateunite两列('variable'和'num)到一个单列并使用spread 将“长”格式重塑为“宽”格式。

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

或者我们可以使用data.table 的开发版本中的dcast,即v1.9.5。通过对列进行分组来获取序列列的便捷函数是来自splitstackshapegetanID。输出将是一个“data.table”。然后使用dcast 将“长”格式转换为“宽”格式。

library(data.table)#v1.9.5+
library(splitstackshape)
dcast(getanID(data, c('id', 'date')), id+date+description~ 
            paste('schedule', .id, sep="."), value.var='value')

注意:安装devel版本的说明是here

【讨论】:

  • 感谢@akrun...我需要阅读一些 tidyr 教程...目前还不完全确定 spread(以及像“gather”这样的功能)是如何工作的,但似乎比 reshape2 容易得多。跨度>
  • @bpace gathermeltspread 相似,就像没有dcastdcast 一样
  • @bpace 没问题。很高兴为您提供帮助。
  • @akrun 非常感谢!在tidyr +1 中不知道unite
猜你喜欢
  • 2022-01-19
  • 2020-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-25
  • 2011-09-05
  • 2018-09-09
  • 2015-11-25
相关资源
最近更新 更多