2017-06-09 1 views
1

Je voudrais transformer mon ensemble de données de sorte que, pour chaque ligne d'origine, toutes les valeurs qu'elle contient deviennent les premières d'une nouvelle ligne, tout en conservant les autres valeurs.Comment créer de nouvelles lignes dans une base de données basée sur le contenu d'une autre ligne avec les mêmes valeurs mais dans un ordre différent?

Je ne suis pas sûr que cette explication est claire alors voici un exemple: disons que j'ai une trame de données qui ressemble à ceci:

V1   V2   V3  V4   V5   V6 
valve  valves  VALVE  VALVES  Valve  Valves 
vaporizer vaporizers Vaporizer Vaporizers NA  NA 

Je voudrais

V1   V2   V3  V4   V5   V6 
valve  valves  VALVE  VALVES  Valve  Valves 
valves  valve  VALVE  VALVES  Valve  Valves 
VALVE  valves  valve  VALVES  Valve  Valves 
VALVES  valves  VALVE  valve  Valve  Valves 
Valve  valves  VALVE  VALVES  valve  Valves 
Valves  valves  VALVE  VALVES  Valve  valve 
vaporizer vaporizers Vaporizer Vaporizers NA   NA 
vaporizers vaporizer Vaporizer Vaporizers NA   NA 
Vaporizer vaporizers vaporizer Vaporizers NA   NA 
Vaporizers vaporizers Vaporizer vaporizer  NA   NA 

Cela signifie prendre en compte le fait qu'il y a des NA (et ne pas créer une nouvelle ligne quand il y en a).

J'ai eu beaucoup de mal avec ce problème depuis 2 jours, donc toute aide serait grandement appréciée! Merci beaucoup

Répondre

0

J'ai d'abord fait une fonction qui permute les colonnes comme vous le désirez. Ensuite, j'ai appliqué cela aux données par ROW. La sortie de apply est une liste si je do.call(rbind,listobject) à lui recoudre ensemble:

# data 
dat <- data.frame(V1 = c("valve","vaporizer"), V2 = c("valves","vaporizers"), 
        V3 = c("VALVE","Vaporizer"), V4 = c("VALVES","Vaporizers"), 
        V5 = c("Valve",NA), V6 = c("Valves",NA), 
        stringsAsFactors = F) 

# function 
musicalchairs <- function(x){ 
    y <- as.data.frame(matrix(NA, nrow = sum(!is.na(x)), ncol = length(x))) 
    y[1,] <- x 
    for(i in 1:length(x)){ 
    if(!is.na(x[i])){ 
     y[i+1,] <- c(y[1,i+1], y[i,-(i+1)]) 
    } 
    } 
    y[1:sum(!is.na(x)),] 
} 

# desired output 
do.call(rbind, apply(dat, 1, musicalchairs)) 

Laissez-moi savoir si vous avez des questions.

+0

Est-ce que cela répond à votre question? –