重构R中的数据框架

时间:2014-10-19 16:56:00

标签: r dataframe

我想知道是否有一种简单的方法来重构我的一些数据。我目前有一个看起来像这样的数据框......

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

有一种简单的方法吗?

提前致谢

:)

1 个答案:

答案 0 :(得分:2)

一种方法是使用dcast/melt中的reshape2。在下面的代码中,我首先使用indxYear为每个transform创建了一系列数字(ave列)。然后,melt已转换的数据集将id.var保留为Year,并indx。然后使用longwide格式数据集重新整形为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列,然后重新整理为长格式,gatherunite两列为一列{{ 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