2017-06-30 1 views
0

Je souhaite dupliquer certaines lignes dans un bloc de données.Ajouter des doublons à certaines lignes et modifier l'ordre des lignes dans une trame de données

df <- structure(list(yrmonth = structure(c(17167, 17167, 17167, 17198, 
17198, 17198, 17226, 17226, 17226, 17257, 17257, 17257), class = "Date"), 
    index = structure(c(2L, 1L, 3L, 2L, 1L, 3L, 2L, 1L, 3L, 2L, 
    1L, 3L), .Label = c("E-W", "N-S", "OS"), class = "factor"), 
    N = c(2, 2, 1, 2, 2, 1, 2, 2, 1, 2, 2, 1), data = c(129, 
    141, 27, 150.5, 209, 87, 247.5, 243, 188, 223, 226.5, 170 
    )), .Names = c("yrmonth", "index", "N", "data"), row.names = 31:42, class = "data.frame") 

Je veux toutes les lignes avec l'étiquette « N-S » apparaissent deux fois, et toutes les lignes avec l'étiquette « OS » apparaît trois fois. Ensuite, je voudrais réorganiser la trame de données de sorte que les étiquettes sont "E-W", "OS", "N-S", "OS", "N-S", "OS".

Je voudrais la trame de données pour ressembler à ceci:

 yrmonth index N data 
31 2017-01-01 N-S 2 129.0 
33 2017-01-01 OS 1 27.0 
31.1 2017-01-01 N-S 2 129.0 
33.1 2017-01-01 OS 1 27.0 
32 2017-01-01 E-W 2 141.0 
33.2 2017-01-01 OS 1 27.0 
34 2017-02-01 N-S 2 150.5 
36 2017-02-01 OS 1 87.0 
34.1 2017-02-01 N-S 2 150.5 
36.1 2017-02-01 OS 1 87.0 
35 2017-02-01 E-W 2 209.0 
36.2 2017-02-01 OS 1 87.0 

Répondre

2

df2 est la sortie finale.

library(tidyverse) 

df2 <- df %>% 
    mutate(index = ifelse(index %in% "N-S", list(rep("N-S", 2)), 
         ifelse(index %in% "OS", list(rep("OS", 3)), list("E-W")))) %>% 
    unnest() %>% 
    group_by(yrmonth) %>% 
    mutate(ID = c(1, 3, 5, 2, 4, 6)) %>% 
    arrange(yrmonth, ID) %>% 
    select(yrmonth, index, N, data) 
3

Voici une solution à ce problème exact, mais il est pas très flexible.

df$freq <- 1 
df[df$index == "N-S", ]$freq <- 2 
df[df$index == "OS", ]$freq <- 3 
df[rep(row.names(df), df$freq), 1:4] 
+0

Merci, cela fonctionne très bien. Savez-vous comment réorganiser les valeurs de sorte que "OS" soit toutes les autres entrées? (deuxième partie de ma question ci-dessus) – phaser

+0

@phaser Votre deuxième question n'est pas claire pour moi. Pourriez-vous clarifier plus? – www

+0

@ycw voir les modifications. Faites-moi savoir si cela n'a toujours pas de sens. – phaser