向数据框添加行,使每个唯一值正好重复n次?

时间:2017-09-06 18:39:33

标签: r

我正在使用R来分析一个包含~100,000行的CSV文件。我很感激任何帮助 - 我真的很陌生。

这是我的表:

Row1 -> Group, Position, Frequency
Row2 -> 192, 1, 0.2
Row3 -> 192, 2, 0.3
Row4 -> 192, 3, 0.1
Row5 -> 193, 4, 0.5
Row6 -> 193, 5, 0.6
Row7 -> 194, 6, 0.2
Row8 -> 194, 7, 0.4
Row9 -> 195, 8, 0.9
Row10 -> 196, 9, 0.8

我希望组列中的每个值重复三次。 192次重复三次,但194次重复两次,而195次和196次只发生一次。我想添加行,这样如果组列中没有三个重复的值,它将添加行以使总共三次重复并将该行的其他列中的单元格留空(或{{1 }})。所以最终结果如下:

NA

2 个答案:

答案 0 :(得分:2)

使用tidyverse,您可以使用tidyr::complete添加缺少的行组合:

library(tidyverse)

df <- data_frame(Row = c("Row2", "Row3", "Row4", "Row5", "Row6", "Row7", "Row8", "Row9", "Row10"), 
                 Group = c(192, 192, 192, 193, 193, 194, 194, 195, 196), 
                 Position = 1:9, 
                 Frequency = c(0.2, 0.3, 0.1, 0.5, 0.6, 0.2, 0.4, 0.9, 0.8))

df_filled <- df %>% 
    group_by(Group) %>% 
    mutate(i = row_number()) %>% 
    complete(i = 1:3)

df_filled
#> # A tibble: 15 x 5
#> # Groups:   Group [5]
#>    Group     i   Row Position Frequency
#>    <dbl> <int> <chr>    <int>     <dbl>
#>  1   192     1  Row2        1       0.2
#>  2   192     2  Row3        2       0.3
#>  3   192     3  Row4        3       0.1
#>  4   193     1  Row5        4       0.5
#>  5   193     2  Row6        5       0.6
#>  6   193     3  <NA>       NA        NA
#>  7   194     1  Row7        6       0.2
#>  8   194     2  Row8        7       0.4
#>  9   194     3  <NA>       NA        NA
#> 10   195     1  Row9        8       0.9
#> 11   195     2  <NA>       NA        NA
#> 12   195     3  <NA>       NA        NA
#> 13   196     1 Row10        9       0.8
#> 14   196     2  <NA>       NA        NA
#> 15   196     3  <NA>       NA        NA

答案 1 :(得分:1)

do.call(rbind, lapply(split(df, df$Group), function(a){
        data.frame(Group = rep(a$Group[1], 3),
                   Position= a$Position[1:3],
                   Frequency = a$Frequency[1:3])
}))
#      Group Position Frequency
#192.1   192        1       0.2
#192.2   192        2       0.3
#192.3   192        3       0.1
#193.1   193        4       0.5
#193.2   193        5       0.6
#193.3   193       NA        NA
#194.1   194        6       0.2
#194.2   194        7       0.4
#194.3   194       NA        NA
#195.1   195        8       0.9
#195.2   195       NA        NA
#195.3   195       NA        NA
#196.1   196        9       0.8
#196.2   196       NA        NA
#196.3   196       NA        NA

DATA

df = structure(list(Group = c(192L, 192L, 192L, 193L, 193L, 194L, 
194L, 195L, 196L), Position = 1:9, Frequency = c(0.2, 0.3, 0.1, 
0.5, 0.6, 0.2, 0.4, 0.9, 0.8)), .Names = c("Group", "Position", 
"Frequency"), class = "data.frame", row.names = c(NA, -9L))