【问题标题】:Add rows to data frame such that there are exactly n repeats of each unique value?将行添加到数据框中,使得每个唯一值恰好有 n 次重复?
【发布时间】:2018-02-15 08:35:15
【问题描述】:

我正在使用 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

我希望组列中的每个值恰好重复 3 次。 192 重复了 3 次,但 194 重复了 2 次,而 195 和 196 只出现了一次。我想添加行,这样如果组列中的值没有三个重复,它将添加行以使总共三个重复,并将该行其他列中的单元格留空(或NA )。所以最终的结果是这样的:

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 -> 193, NA, NA
Row8 -> 194, 6, 0.2
Row9 -> 194, 7, 0.4
Row10-> 194, NA, NA
Row11 -> 195, 8, 0.9
Row12 -> 195, NA, NA
Row13 -> 195, NA, NA
Row14 -> 196, 9, 0.8
Row15 -> 196, NA, NA
Row16 -> 196, NA, NA

【问题讨论】:

    标签: r


    【解决方案1】:

    使用 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
    

    【讨论】:

    • 简洁优雅
    • 非常感谢!!这很有帮助:-)
    【解决方案2】:
    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
    

    数据

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

    【讨论】:

    • 非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 2013-08-11
    • 2021-05-26
    • 2018-07-26
    • 2020-05-17
    • 2019-02-10
    • 1970-01-01
    相关资源
    最近更新 更多