【问题标题】:Forward fill rows in a r data table在 r 数据表中前向填充行
【发布时间】:2020-05-09 17:39:47
【问题描述】:

我有一个大数据表,格式如下

Name       Value     1      2     3     4     5 
A           58       1      NA    NA    NA    NA
B           47       NA     1     NA    NA    NA
C           89       NA     NA    1     NA    NA
D           68       NA     NA    NA    1     NA
E           75       NA     NA    NA    NA    1

我想转发数据表的行以实现以下结果。我知道如何转发填充列。

Name       Value     1      2     3     4     5 
A           58       1      1     1     1     1
B           47       NA     1     1     1     1
C           89       NA     NA    1     1     1
D           68       NA     NA    NA    1     1
E           75       NA     NA    NA    NA    1  

救命!

【问题讨论】:

    标签: r dataframe data.table


    【解决方案1】:

    data.table 有它自己的nafill 函数。

    library(data.table) #v>=1.12.8
    library(magrittr)
    
    melt(dt, id = 1:2) %>% 
      .[, value := nafill(value, "locf"), by = Name] %>% 
      dcast(., ... ~ variable)
    
    #    Name Value  1  2  3  4 5
    # 1:    A    58  1  1  1  1 1
    # 2:    B    47 NA  1  1  1 1
    # 3:    C    89 NA NA  1  1 1
    # 4:    D    68 NA NA NA  1 1
    # 5:    E    75 NA NA NA NA 1
    

    数据

    dt <- fread("Name       Value     1      2     3     4     5 
    A           58       1      NA    NA    NA    NA
    B           47       NA     1     NA    NA    NA
    C           89       NA     NA    1     NA    NA
    D           68       NA     NA    NA    1     NA
    E           75       NA     NA    NA    NA    1")
    

    【讨论】:

    • 您是否害怕以新依赖为代价的临时变量? :)
    • Jan,我不认为 magrittr 是一个严重的依赖项,我也喜欢它在链接许多操作时提供的可读性。我也不喜欢把全球环境弄得乱七八糟,所以我觉得它是不太糟糕的选择。如果我安装整个 tidyverse 只是为了使用 mutate 而不是 $ 我绝对同意你的看法:)
    【解决方案2】:

    tidyr 中使用fill 用之前的值填充缺失值。

    library(dplyr)
    library(tidyr)
    
    df %>%
      pivot_longer(3:7) %>%
      group_by(Name) %>%
      fill(value) %>%
      ungroup() %>% 
      pivot_wider()
    
    # # A tibble: 5 x 7
    #   Name  Value   `1`   `2`   `3`   `4`   `5`
    #   <fct> <int> <int> <int> <int> <int> <int>
    # 1 A        58     1     1     1     1     1
    # 2 B        47    NA     1     1     1     1
    # 3 C        89    NA    NA     1     1     1
    # 4 D        68    NA    NA    NA     1     1
    # 5 E        75    NA    NA    NA    NA     1
    

    注意:上面的输出与

    相同
    df %>% fill(3:7, .direction = "up")
    

    但逻辑不同。前者属于“向前填充行”,后者是“向后填充列”。在其他情况下它们会有所不同。


    数据

    df <- structure(list(Name = structure(1:5, .Label = c("A", "B", "C", 
    "D", "E"), class = "factor"), Value = c(58L, 47L, 89L, 68L, 75L
    ), `1` = c(1L, NA, NA, NA, NA), `2` = c(NA, 1L, NA, NA, NA), 
    `3` = c(NA, NA, 1L, NA, NA), `4` = c(NA, NA, NA, 1L, NA), 
    `5` = c(NA, NA, NA, NA, 1L)), class = "data.frame", row.names = c(NA, -5L))
    

    【讨论】:

      猜你喜欢
      • 2017-08-12
      • 2019-10-28
      • 2022-01-04
      • 2023-02-26
      • 2021-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多