2017-06-30 29 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”标签的行出现两次,并且所有具有“OS”标签的行出现三次。然后我想对数据帧重新排序,使标签为“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”是其他所有条目吗? (上面我的问题的第二部分) – phaser

+0

@phaser你的第二个问题对我来说还不清楚。你能澄清更多吗? – www

+0

@ycw查看编辑。让我知道它是否仍然没有意义。 – phaser

相关问题