2017-09-12 7 views
0

Je suis assez sûr que cette question serait extraordinairement facile à résoudre pour certains navigation dans ce forum.Comment empiler un ensemble de données avec deux variables connexes dans R

Mon problème est que mon ancien ensemble de données est structuré comme cela est indiqué ci-dessous:

enter image description here

Il représente les coordonnées XY dans les différents échantillons (1, 2, 3, 4).

Je voudrais empiler les données mais garder les relations entre les coordonnées, de sorte que deux variables (x et y) doivent être empilées. Je voudrais obtenir un résultat comme celui-ci montré ici:

enter image description here

Je sais que je peux le faire manuellement, mais je suis sûr que R serait mon optimiser mon temps de travail plus pratique,. Evidemment, c'est un exemple dont le but est de montrer le problème. Mes données d'origine, qui ne sont pas montrées ici, sont composées par centaines de colonnes et rangées ...

+0

Ce serait génial si vous pouvez fournir un exemple reproductible de votre ensemble de données. – www

Répondre

1

Voici une solution tidyverse.

library(tidyverse) 
old <- data.frame(x1 = c(2.2, NA, NA, NA), 
       y1 = c(2.1, NA, NA, NA), 
       x2 = c(2.3, 2.2, NA, NA), 
       y2 = c(2.5, 2.3, NA, NA), 
       x3 = c(1.9, 2.1, 2.3, NA), 
       y3 = c(2.6, 2.6, 2.3, NA), 
       x4 = c(2.5, 2.6, 2.5, 2.1), 
       y4 = c(2.1, 2.3, 2.6, 2.2)) 

new <- gather(old, xy, val) %>% 
    mutate(coord = substr(xy, 1, 1), 
      pair = parse_number(xy)) %>% 
    group_by(xy) %>% 
    mutate(sample = 1:n()) %>% 
    ungroup() %>% 
    select(-xy) %>% 
    spread(coord, val) %>% 
    filter(!is.na(x) & !is.na(y)) 

new 
# A tibble: 10 x 4 
    pair sample  x  y 
    <dbl> <int> <dbl> <dbl> 
1  1  1 2.2 2.1 
2  2  1 2.3 2.5 
3  2  2 2.2 2.3 
4  3  1 1.9 2.6 
5  3  2 2.1 2.6 
6  3  3 2.3 2.3 
7  4  1 2.5 2.1 
8  4  2 2.6 2.3 
9  4  3 2.5 2.6 
10  4  4 2.1 2.2 

Notez que la dernière ligne est seulement pour la suppression des données manquantes, et supprime toutes les lignes qui ne sont pas entrées valides sur x et y. J'espère que c'est utile.

+0

C'est exactement ce que je voulais! Merci beaucoup Daniel! – antecessor

+0

Heureux que c'était utile! –