2017-10-17 3 views
0

Hier Beispieldaten ist zu spalten:Wie data.frame gleich Spalten

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

Ich möchte die neue data.frame anzuordnen, so dass es immer 6 Spalten hat, die nächste Zeile (nach dem seit ncol Verblockung > 6) würde die nächsten 6 Spaltennamen und die nächste Zeile ihre Werte enthalten. Die letzte Zeile, wenn ncol < 6 die Werte mit einer leeren Zeichenfolge einschließlich der Spaltennamen gefüllt sind.

Hier wird gewünschte Ausgabe:

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

Ein weiteres Beispiel:

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 

EDIT:

So wie es möglicherweise zu nähern ist:

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 

kombinieren jeder zweite s plit von s und s1

s1[c(TRUE,FALSE)] 

Antwort

1

Hier ist eine Art und Weise, nicht so schön, aber das ist eine hässliche Frage: 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

Für das Leben von mir, dass ich nicht einen Anwendungsfall für diese herausfinden kann ... aber aus Gründen der bereitgestellten Beispiele ...

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 

EDIT zu zwingen, NA zu 'leeren String'

+0

Es funktioniert mit dem Beispiel, aber nicht mit realen Daten. Die Lösung ist zu kompliziert für diese Aufgabe (hässlicher Hack), was mich denken lässt, wie ich sie an die Bedürfnisse anpassen (fixieren) kann. Außerdem benötigen Sie das 'jsonlite'-Paket, damit es funktioniert, und die' rbind.pages' sind nicht veraltet und verwenden stattdessen 'rbind_pages'. Vielen Dank. – Maximilian

+0

Dies gibt nicht die gewünschte Ausgabe –

+0

bearbeiten ... über die falschen Zeilen kopiert. Entschuldigung ... –

Verwandte Themen