【问题标题】:R: Create new column in dataframe from existing columns using conditionsR:使用条件从现有列在数据框中创建新列
【发布时间】:2021-05-31 20:34:52
【问题描述】:

我有一个包含两个数字列的数据框,我想使用它们来创建并使用条件填充第三列。

这是我的数据框的示例:

- A B
1 123 134
2 343 NA
3 123 145
4 NA 243
5 NA NA
6 NA 293

我想根据 A 列和 B 列中的值以及这些条件创建一个新列:

  • 如果 A 列中有值,我希望 C 列中有该值
  • 如果 A 列包含 NA 而 B 列包含一个值,我希望 C 列中包含该值
  • 如果两列都不包含值,我希望在 C 列中有一个 NA

示例输出:

A B C
1 123 134 123
2 343 NA 342
3 123 145 123
4 NA 243 243
5 NA NA NA
6 NA 293 243

【问题讨论】:

    标签: r dataframe conditional-statements


    【解决方案1】:

    您可以使用以下解决方案:

    library(dplyr)
    
    df %>%
      rowwise() %>%
      mutate(C = case_when(
        !is.na(A) ~ A,
        is.na(A) & !is.na(B) ~ B,
        is.na(A) & is.na(B) ~ NA_integer_
      ))
    
    # A tibble: 6 x 3
    # Rowwise: 
          A     B     C
      <int> <int> <int>
    1   123   134   123
    2   343    NA   343
    3   123   145   123
    4    NA   243   243
    5    NA    NA    NA
    6    NA   293   293
    

    数据

    structure(list(A = c(123L, 343L, 123L, NA, NA, NA), B = c(134L, 
    NA, 145L, 243L, NA, 293L)), class = "data.frame", row.names = c("1", 
    "2", "3", "4", "5", "6"))
    

    【讨论】:

      【解决方案2】:

      另一个选项是coalesce

      df1 <- df1 %>% 
          mutate(C = coalesce(A, B))
      

      -输出

      df1
      #   A   B   C
      #1 123 134 123
      #2 343  NA 343
      #3 123 145 123
      #4  NA 243 243
      #5  NA  NA  NA
      #6  NA 293 293
      

      或者使用来自data.tablefcoalesce

      library(data.table)
      setDT(df1)[, C := fcoalesce(A, B)]
      

      数据

      df1 <- 
      structure(list(A = c(123L, 343L, 123L, NA, NA, NA), B = c(134L, 
      NA, 145L, 243L, NA, 293L)), class = "data.frame", row.names = c("1", 
      "2", "3", "4", "5", "6"))
      

      【讨论】:

        猜你喜欢
        • 2020-09-18
        • 2019-11-09
        • 1970-01-01
        • 2021-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多