Combine data in many row into a columnn

2019-02-26 18:55发布

问题:

I have a data like this:

  year  Male
1 2011    8
2 2011    1
3 2011    4
4 2012    3
5 2012    12
6 2012    9
7 2013    4
8 2013    3
9 2013    3

and I need to group the data for the year 2011 in one column, 2012 in the next column and so on.

   2011  2012  2013
1   8     3     4 
2   1    12     3
3   4     9     3

How do I achieve this?

回答1:

One option is unstack if the number of rows per 'year' is the same

unstack(df1, Male ~ year)


回答2:

One option is to use functions from dplyr and tidyr.

library(dplyr)
library(tidyr)

dt2 <- dt %>%
  group_by(year) %>%
  mutate(ID = 1:n()) %>%
  spread(year, Male) %>%
  select(-ID)


回答3:

1

If every year has the same number of data, you could split the data and cbind it using base R

do.call(cbind, split(df$Male, df$year))
#     2011 2012 2013
#[1,]    8    3    4
#[2,]    1   12    3
#[3,]    4    9    3

2

If every year does not have the same number of data, you could use rbind.fill of plyr

df[10,] = c(2015, 5)   #Add only one data for the year 2015
library(plyr)
setNames(object = data.frame(t(rbind.fill.matrix(lapply(split(df$Male, df$year), t)))),
         nm = unique(df$year))
#  2011 2012 2013 2015
#1    8    3    4    5
#2    1   12    3   NA
#3    4    9    3   NA

3

Yet another way is to use dcast to convert data from long to wide format

df[10,] = c(2015, 5)   #Add only one data for the year 2015
library(reshape2)
dcast(df, ave(df$Male, df$year, FUN = seq_along) ~ year, value.var = "Male")[,-1]
#  2011 2012 2013 2015
#1    8    3    4    5
#2    1   12    3   NA
#3    4    9    3   NA