【问题标题】:Combine data in many row into a columnn将多行数据合并为一列
【发布时间】:2017-08-11 18:35:13
【问题描述】:

我有这样的数据:

  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

我如何做到这一点?

【问题讨论】:

    标签: r dataframe reshape


    【解决方案1】:

    如果每个“年”的行数相同,则一个选项是 unstack

    unstack(df1, Male ~ year)
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        1

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-08-14
          • 1970-01-01
          • 2022-01-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-01-23
          相关资源
          最近更新 更多