2017-10-17 81 views
0

這裏是樣本數據:如何data.frame拆分等於列

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

我想安排新data.frame,使其始終具有6列,下一行(因爲夾板的NcoI後> 6)將包含接下來的6列名稱和下一行的值。最後一行if ncol < 6這些值用包含列名的空字符串填充。

在這裏期望的輸出:

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 

結合每秒的s PLIT和s1

s1[c(TRUE,FALSE)] 

回答

1

這裏有一個方法,不那麼漂亮,但是這是一個醜陋的問題: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 
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爲「空字符串」

+0

它適用於該示例,但不適用於實際數據。這個解決方案對於這個任務來說太複雜了(醜陋的黑客攻擊),這讓我想到如何使它適應需求。你也需要'jsonlite'包來使它工作,並且'rbind.pages'不被棄用,而是使用'rbind_pages'。謝謝。 – Maximilian

+0

這沒有給出所需的輸出 –

+0

編輯...複製在錯誤的行。道歉... –