2017-06-30 5 views
0

データフレームに一部の行を複製したいとします。一部の行に重複を追加し、データフレーム内の行の順序を変更します。

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") 

「N-S」ラベルを含むすべての行を2回表示し、「OS」ラベルを含むすべての行を3回表示します。次に、ラベルが "E-W"、 "OS"、 "N-S"、 "OS"、 "N-S"、 "OS"となるようにデータフレームの順序を変更したいと思います。

私はこのようにして、データフレームをしたいと思います。ここでは

 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 

答えて

2

df2が最終出力です。

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

は、まさにこの問題を解決するが、それは非常に柔軟ではありません。

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

ありがとうございます。 「OS」が他のすべてのエントリになるように値を並べ替える方法を知っていますか? (上の質問の2番目の部分) – phaser

+0

@phaser 2番目の質問は私には不明です。もっと明確にできますか? – www

+0

@ycw編集を参照してください。まだそれが理にかなっていないかどうか私に教えてください。 – phaser

関連する問題