2017-10-21 47 views
0

J'ai une trame de données avec quatre colonnes, X1, X2, X3 et Y. La valeur Y est commune à toutes les valeurs X dans chaque ligne. Je voudrais réorganiser la trame de données pour avoir une seule colonne X (comprenant les trois colonnes de valeur X) avec la valeur Y correspondante dans la deuxième colonne. L'objectif final est de pouvoir tracer X, Y puis de régresser Y ~ X en utilisant un modèle approprié.Réorganiser plusieurs colonnes de la trame de données avec la colonne récurrente commune

Voici un exemple pour travailler avec

x1<-c(1,14,87,126,483,1004) 
x2<-c(18,43,112,364,987,1014) 
x3<-c(4,83,96,125,631,872) 
y<-c(3,54,68,73,135,287) 
df<-data.frame(x1,x2,x3,y) 

Et voici à quoi il ressemble

x1 x2 x3 y 
1 1 18 4 3 
2 14 43 83 54 
3 87 112 96 68 
4 126 364 125 73 
5 483 987 631 135 
6 1004 1014 872 287 

Voici ce que je voudrais qu'il ressemble

X  Y 
1  3 
14  54 
87  68 
126 73 
483 135 
1004 287 
18  3 
43  54 
112 68 
364 73 
987 135 
1014 287 
4  3 
83  54 
96  68 
125 73 
631 135 
872 287 

J'ai avait un aspect here mais il n'y a pas de colonne commune qui est répétée, comme avec ma colonne "y".

Répondre

1
# Transform data 
library(reshape2) 
# Melt (group) your table by y column 
df2 <- melt(df, "y") 

# Plot data 
library(ggplot2) 
ggplot(df2, aes(value, y, color = variable)) + 
    geom_line() 

enter image description here

1

I. En utilisant rbind() et cbind() fonction

df1 <- data.frame(rbind(cbind(df$x1,df$y), cbind(df$x2, df$y), cbind(df$x2, df$y))) 
names(df1) <- c("X","y") 

OU

df1 <- data.frame(rbind(cbind(X = df$x1,y = df$y), cbind(X=df$x2, y=df$y), cbind(X=df$x2, y=df$y))) 

II. En utilisant la fonction stack()

df1 <- data.frame(X = stack(df, select = c(x1,x2,x3))[,1], y = df$y) 
1

Vous pouvez utiliser gather et de tidyr avec select de dplyr:

library(dplyr) 
library(tidyr) 

df %>% 
    gather(key = name_x, value = x, - y) %>% 
    select(-name_x)