代码之家  ›  专栏  ›  技术社区  ›  fishing4wall3y3

计算R中多个变化列之间的差异

  •  0
  • fishing4wall3y3  · 技术社区  · 1 年前

    我在R中有一个数据帧(df),有7列

    身份证件 第一年 第二年 3年级 尺寸1 尺寸2 尺寸3
    A. 2021 2022 NA 10 15 NA
    B 2022 2023 2024 20 21 25
    C 2021 2022 NA 5. 20 NA

    我想添加一个名为“差异”的第8列,它为我提供了每个人的增长率,即(尺寸3-尺寸1)/(年份3-年份1)。我能够用这段代码做到这一点:

    df2 <- df %>%
      mutate(difference = (df$Size3 -df$Size1)/(df$Year3 - df$Year1))
    

    然而,有些人只有第1年和第2年。我如何写一条语句,说明如果第3年=NA,则将“差异”列从(Size2-Size1)/(Year2-Year1)中删除?

    期望输出:

    身份证件 第一年 第二年 3年级 尺寸1 尺寸2 尺寸3 差异
    A. 2021 2022 NA 10 15 NA 5.
    B 2022 2023 2024 20 21 25 2.5
    C 2021 2022 NA 5. 20 NA 15
    2 回复  |  直到 1 年前
        1
  •  2
  •   ThomasIsCoding    1 年前

    你可以试试 ifelse

    transform(
      df,
      Difference = ifelse(
        is.na(Year3),
        (Size2 - Size1) / (Year2 - Year1),
        (Size3 - Size1) / (Year3 - Year1)
      )
    )
    

    这给了

      ID Year1 Year2 Year3 Size1 Size2 Size3 Difference
    1  A  2021  2022    NA    10    15    NA        5.0
    2  B  2022  2023  2024    20    21    25        2.5
    3  C  2021  2022    NA     5    20    NA       15.0
    
        2
  •  0
  •   G. Grothendieck    1 年前

    如果,如问题中所述,以下两个或两个都不是真的 Year3 Size3 如果是NA,那么我们可以使用 coalesce . 聚结 如果它不是NA,则返回其第一个参数,否则返回其第二个参数。输入在末尾的注释中提供。

    library(dplyr)
    
    # check that both or neither Year3 and Size3 are NA
    with(df, all(is.na(Year3) == is.na(Size3)))
    ## [1] TRUE
    
    df %>%
      mutate(Difference = (coalesce(Size3, Size2) - Size1) / 
        (coalesce(Year3, Year2) - Year1))
    ##   ID Year1 Year2 Year3 Size1 Size2 Size3 Difference
    ## 1  A  2021  2022    NA    10    15    NA        5.0
    ## 2  B  2022  2023  2024    20    21    25        2.5
    ## 3  C  2021  2022    NA     5    20    NA       15.0
    

    注:

    可复制形式的输入:

    df <- data.frame(
      ID = c("A", "B", "C"),
      Year1 = c(2021L, 2022L, 2021L),
      Year2 = c(2022L, 2023L, 2022L),
      Year3 = c(NA, 2024L, NA),
      Size1 = c(10L, 20L, 5L),
      Size2 = c(15L, 21L, 20L),
      Size3 = c(NA, 25L, NA)
    )