我想知道是否有一种简单的方法来重构我的一些数据。我目前有一个看起来像这样的数据框......
Year Cat Number
2001 A 15
2001 B 2
2002 A 4
2002 B 12
但我最终想要的是将它置于这种形状......
Year Cat Number Cat Number
2001 A 15 B 2
2002 A 4 B 12
有一种简单的方法吗?
提前致谢
:)
答案 0 :(得分:2)
一种方法是使用dcast/melt
中的reshape2
。在下面的代码中,我首先使用indx
和Year
为每个transform
创建了一系列数字(ave
列)。然后,melt
已转换的数据集将id.var
保留为Year
,并indx
。然后使用long
将wide
格式数据集重新整形为dcast
格式。如果您不需要后缀_number
,则可以使用gsub
删除该部分。
library(reshape2)
res <- dcast(melt(transform(df, indx=ave(seq_along(Year), Year, FUN=seq_along)),
id.var=c("Year", "indx")), Year~variable+indx, value.var="value")
colnames(res) <- gsub("\\_.*", "", colnames(res))
res
# Year Cat Cat Number Number
#1 2001 A B 15 2
#2 2002 A B 4 12
或使用dplyr/tidyr
。这里的想法与上面类似。在按Year
列进行分组后,使用indx
生成mutate
列,然后重新整理为长格式,gather
,unite
两列为一列{{ 1}}然后使用VarIndx
重新形成宽格式。在最后一步spread
中,名称以mutate_each
开头的列将转换为Number
列。
numeric
或者您可以使用library(dplyr)
library(tidyr)
res1 <- df %>%
group_by(Year) %>%
mutate(indx=row_number()) %>%
gather("Var", "Val", Cat:Number) %>%
unite(VarIndx, Var, indx) %>%
spread(VarIndx, Val) %>%
mutate_each(funs(as.numeric), starts_with("Number"))
res1
# Source: local data frame [2 x 5]
# Year Cat_1 Cat_2 Number_1 Number_2
#1 2001 A B 15 2
#2 2002 A B 4 12
中的indx
创建.id
变量getanID
(来自@Ananda Mahto(splitstackshape的作者)的评论并使用{{1}来自splitstackshape
reshape
base R