将多行数据合并成一列

Combine data in many row into a columnn

我有这样的数据:

  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

我需要将 2011 年的数据分组在一列中,2012 年的数据分组在下一列中,依此类推。

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

如何实现?

如果每个 'year' 的行数相同,一个选项是 unstack

unstack(df1, Male ~ year)

一种选择是使用 dplyrtidyr 中的函数。

library(dplyr)
library(tidyr)

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

1

如果每年都有相同数量的数据,您可以 split 数据 cbind 使用基数 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

如果每年没有相同数量的数据,可以使用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

另一种方法是使用 dcast 将数据从长格式转换为宽格式

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