将 ddply 转换为 dplyr 和 tidyr 代码(变异、联合、传播)
Translating ddply to dplyr and tidyr code (mutate, unite, spread)
我有以下数据集:
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
变量使用联合,但这也没有用。
如有任何帮助,我们将不胜感激!
使用 dplyr/tidyr
,我们按 'id'、'date' 分组,创建 'num' 列作为 row_number()
和 mutate
、unite
将两列('variable' 和 '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
或者我们可以使用 data.table
的开发版本 dcast
,即 v1.9.5。通过对列进行分组来获取序列列的一个方便的函数是getanID
from splitstackshape
。输出将是 'data.table'。然后使用 dcast
将 'long' 转换为 'wide' 格式。
library(data.table)#v1.9.5+
library(splitstackshape)
dcast(getanID(data, c('id', 'date')), id+date+description~
paste('schedule', .id, sep="."), value.var='value')
注意:安装开发版本的说明是 here
我有以下数据集:
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
变量使用联合,但这也没有用。
如有任何帮助,我们将不胜感激!
使用 dplyr/tidyr
,我们按 'id'、'date' 分组,创建 'num' 列作为 row_number()
和 mutate
、unite
将两列('variable' 和 '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
或者我们可以使用 data.table
的开发版本 dcast
,即 v1.9.5。通过对列进行分组来获取序列列的一个方便的函数是getanID
from splitstackshape
。输出将是 'data.table'。然后使用 dcast
将 'long' 转换为 'wide' 格式。
library(data.table)#v1.9.5+
library(splitstackshape)
dcast(getanID(data, c('id', 'date')), id+date+description~
paste('schedule', .id, sep="."), value.var='value')
注意:安装开发版本的说明是 here