【问题标题】:Group by condition with no aggregate R按条件分组,无聚合 R
【发布时间】:2022-12-06 22:14:26
【问题描述】:

我有一个数据框,我想按 ID 和日期分组,但没有任何聚合功能。 因为我的数据框是这样的

ID DATE VAL 1 VAL 2 VAL 3 VAL 4
ID1 2018-02-08 01:00:00 10 NA NA NA
ID1 2018-02-08 01:00:00 NA 30 NA NA
ID1 2018-02-08 01:00:00 NA NA 90 NA
ID1 2018-02-08 01:00:00 NA NA NA 60

我想要做的是向上移动连续列的值,以便在一行中具有相同 DATE 和相同 ID 的值。

预期结果

ID DATE VAL 1 VAL 2 VAL 3 VAL 4
ID1 2018-02-08 01:00:00 10 30 90 60

【问题讨论】:

    标签: r dataframe rstudio


    【解决方案1】:

    我不确定“聚合函数”是什么意思。你能解释一下你的意思吗?

    我会这样做的,但我怀疑这不是您要找的东西?

    library(tidyverse)
    
    d <-structure(list(ID = c("ID1", "ID1", "ID1", "ID1"), 
                       DATE = c("2018-02-08 01:00:00","2018-02-08 01:00:00", 
                                "2018-02-08 01:00:00", "2018-02-08 01:00:00"),
                       VAL.1 = c(10L, NA, NA, NA), 
                       VAL.2 = c(NA, 30L, NA, NA), 
                       VAL.3 = c(NA, NA, 90L, NA), 
                       VAL.4 = c(NA, NA, NA, 60L)), 
                  class = "data.frame", 
                  row.names = c(NA,-4L))
    
    d %>% pivot_longer(-c("ID", "DATE")) %>% 
      filter(!is.na(value)) %>% 
      pivot_wider(names_from = "name", values_from = "value")
    #> # A tibble: 1 × 6
    #>   ID    DATE                VAL.1 VAL.2 VAL.3 VAL.4
    #>   <chr> <chr>               <int> <int> <int> <int>
    #> 1 ID1   2018-02-08 01:00:00    10    30    90    60
    

    创建于 2022-12-06 reprex v2.0.2

    【讨论】:

    • 结果是你输出了我期望的东西。我有相同的 ID 和相同的 DATE 重复超过 10 行。每列代表一个测量值。
    【解决方案2】:

    summariseacrossna.omit一起使用:

    library(dplyr)
    library(tidyr)
    
    data |>
      group_by(ID, DATE) |>
      summarise(across(starts_with("VAL"), na.omit)) |>
      ungroup()
    

    fillslice(或distinct):

    library(dplyr)
    library(tidyr)
    
    data |>
      group_by(ID, DATE) |>
      fill(starts_with("VAL"), .direction = "downup") |>
      slice(1) |>
      ungroup()
    

    输出:

    # A tibble: 1 × 6
      ID    DATE        VAL1  VAL2  VAL3  VAL4
      <chr> <date>     <dbl> <dbl> <dbl> <dbl>
    1 ID1   2018-02-08    10    30    90    60
    

    数据:

    library(readr)
    
    data <- read_table("ID  DATE    VAL1    VAL2    VAL3    VAL4
    ID1 2018-02-08  10  NA  NA  NA
    ID1 2018-02-08  NA  30  NA  NA
    ID1 2018-02-08  NA  NA  90  NA
    ID1 2018-02-08  NA  NA  NA  60")
    ``
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-02
      • 1970-01-01
      • 1970-01-01
      • 2021-01-19
      • 2014-03-12
      • 1970-01-01
      相关资源
      最近更新 更多