【问题标题】:How to split data.frame to equal columns如何将data.frame拆分为相等的列
【发布时间】:2018-03-29 15:14:42
【问题描述】:

这里是示例数据:

df <- data.frame(t(data.frame(seq(1,10,1)))); rownames(df) <- NULL; 
colnames(df) <- letters[1:ncol(df)]
df

我想安排新的 data.frame 以使其始终具有 6 列,下一行(自 ncol>6 以来的夹板之后)将包含接下来的 6 个列名和下一行的值。如果 ncol

这是所需的输出:

  a b c d e f 
1 1 2 3 4 5 6  
2 g h i j 
3 7 8 9 10 

另一个例子:

df <- data.frame(t(data.frame(seq(1,15,1)))); rownames(df) <- NULL; 
colnames(df) <- letters[1:ncol(df)]
df

  a b c d e f
1 1 2 3 4 5 6
2 g h i j k l
3 7 8 9 10 11 12
4 m n o
5 13 14 15

编辑:

接近它的方法可能是:

n <- 6
ncl <- nrow(df)

s <- split(df, rep(1:ceiling(ncl/n), each=n, length.out=ncl))
s

s1 <- split(rownames(df), rep(1:ceiling(ncl/n), each=n, length.out=ncl))
s1

合并ss1 的每一秒分割

s1[c(TRUE,FALSE)]

【问题讨论】:

    标签: r


    【解决方案1】:

    对于我的生活,我无法找出一个用例......但为了提供的例子......

    seq(1, ncol(df), by = 6) %>% {
        starts <- .
        ends <- c(lead(.,1,NULL)-1, ncol(df))
        base_df <- df[,starts[[1]]:ends[[1]]]
        rbind(base_df, rbind.pages(Map(function(s, e){
           d <- df[,seq(s, e)]
           data.frame(rbind(colnames(d), d)) %>% setNames(colnames(base_df)[1:length(.)])
        }, s = starts[-1], e = ends[-1]))
            )  %>% 
            mutate_all(function(x){
                ifelse(!is.na(x), x, "")
            })
    }
    
       a  b  c  d  e  f
    1  1  2  3  4  5  6
    2  g  h  i  j  k  l
    3  7  8  9 10 11 12
    4  m  n  o         
    5 13 14 15   
    

    编辑强制 NA 为“空字符串”

    【讨论】:

    • 它适用于示例,但不适用于真实数据。解决方案对于这项任务来说太复杂了(丑陋的 hack),这让我思考如何适应(修复)需求。您还需要jsonlite 包才能使其正常工作,而且rbind.pages 未被弃用,而是使用rbind_pages。谢谢。
    • 这没有给出想要的输出
    【解决方案2】:

    这是一个方法,不是很漂亮,但这是一个丑陋的问题:D

    library(tibble)
    library(dplyr)
    df1 <- matrix(c(names(df),rep('',6 - ncol(df)%%6)) %>% unlist, ncol=6,byrow=T) %>% as_tibble %>% rowid_to_column()
    df2 <- matrix(c(df       ,rep('',6 - ncol(df)%%6)) %>% unlist, ncol=6,byrow=T) %>% as_tibble %>% rowid_to_column()
    bind_rows(df1,df2) %>% arrange(rowid) %>% select(-1) %>% setNames(.[1,]) %>% slice(-1)
    
    # # A tibble: 3 x 6
    #       a     b     c     d     e     f
    #   <chr> <chr> <chr> <chr> <chr> <chr>
    # 1     1     2     3     4     5     6
    # 2     g     h     i     j            
    # 3     7     8     9    10
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-07
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      • 2014-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多