【问题标题】:R - Split a one column dataframe into multiple columnsR - 将一列数据框拆分为多列
【发布时间】:2017-03-29 22:48:39
【问题描述】:

我有一个数据框,它是一个包含所有州缩写的列:

Name
AK
AL
AR
AZ
CO
CT
DC
FL

我想将此列拆分为多列,这样一列的单元格数不会超过 5 个。

Name1    Name2
AK       CT
AL       DC
AR       FL
AZ
CO

我可以为我想做的事情创建代码,但必须有更好的方法:

states <- as.data.frame(state.abb)

new.table <- as.data.frame(states[1:5,])

i <- 6
k <- 2

repeat{
  new.table[,k] <- as.data.frame(states[(i):(i+4),])
  i <- i + 5
  k <- k + 1
  if(i>nrow(states)){
    break
  }
}

【问题讨论】:

    标签: r dataframe reshape


    【解决方案1】:

    如果NA 可以用于空白值,那么我们可以执行以下操作。假设您的数据名为df,我们可以先创建一个值向量,用于拆分数据。

    (x <- rep(1:ceiling(nrow(df) / 5), each = 5, length.out = nrow(df)))
    # [1] 1 1 1 1 1 2 2 2
    

    现在我们可以拆分数据,循环结果列表以使每个元素长度为 5,并强制转换为数据框。列名在此处动态创建。之后再创建它们可能会更有效。

    as.data.frame(lapply(split(df$Name, paste0(names(df), x)), "length<-", 5))
    #   Name1 Name2
    # 1    AK    CT
    # 2    AL    DC
    # 3    AR    FL
    # 4    AZ  <NA>
    # 5    CO  <NA>
    

    【讨论】:

      【解决方案2】:

      类似于@RichScriven 的概念,但使用matrix 来处理整形:

      columniser <- function(x, n) {
        m <- matrix(NA, nrow=n, ncol=ceiling(length(x)/n) )
        m[1:length(x)] <- x
        as.data.frame(m)
      }
      
      columniser(states$state.abb, 5)
      #  V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
      #1 AL CO HI KS MA MT NM OK SD  VA
      #2 AK CT ID KY MI NE NY OR TN  WA
      #3 AZ DE IL LA MN NV NC PA TX  WV
      #4 AR FL IN ME MS NH ND RI UT  WI
      #5 CA GA IA MD MO NJ OH SC VT  WY
      
      columniser(1:12, 5)
      #  V1 V2 V3
      #1  1  6 11
      #2  2  7 12
      #3  3  8 NA
      #4  4  9 NA
      #5  5 10 NA
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-06
        • 1970-01-01
        • 1970-01-01
        • 2021-06-18
        • 2021-03-27
        • 2013-08-04
        相关资源
        最近更新 更多