【问题标题】:Create new column by two conditions通过两个条件创建新列
【发布时间】:2021-11-23 14:09:43
【问题描述】:

我想通过将 value3 的非缺失值区分为 diff= value1 -value3diff= value1 -value2 如果只有 value3 为 NA 来创建新的差异列。

data<-data.frame(id=c(1,2,3,4,5,6,7,8),
                value1=c(10,12,11,15,16,14,14,11),
                value2=c(9,5,6,10,8,10,6,8),
                value3=c(4,8,7,NA,9,NA,5,NA))

期望的输出:

 id value1 value2 value3 diff
   1    10    9    4    6
   2    12    5    8    4
   3    11    6    7    4
   4    15   10    NA   5
   5    16   8     9    7
   6    14   10    NA   4
   7    14   6     5    9
   8    11   8     NA   3
   

【问题讨论】:

    标签: r dplyr plyr


    【解决方案1】:

    dplyr 中,您可以使用coalesce 获得value3value2 之间的非NA 值。

    library(dplyr)
    
    data %>% mutate(diff = value1 - coalesce(value3, value2))
    
    #  id value1 value2 value3 diff
    #1  1     10      9      4    6
    #2  2     12      5      8    4
    #3  3     11      6      7    4
    #4  4     15     10     NA    5
    #5  5     16      8      9    7
    #6  6     14     10     NA    4
    #7  7     14      6      5    9
    #8  8     11      8     NA    3
    

    在带有ifelse的基础R中-

    transform(data, diff = value1 - ifelse(is.na(value3), value2, value3))
    

    data.tablefcoalesce

    library(data.table)
    setDT(data)[, diff := value1 - fcoalesce(value3, value2)]
    

    【讨论】:

    • 谢谢你,@Ronak Shah。它是否适用于值以外的日期?
    • 是的,这也适用于日期。
    • 您可以编辑您的帖子以添加可重现的示例,以便更容易提供帮助吗?
    【解决方案2】:

    我们可以使用

    library(dplyr)
    data %>%
        mutate(diff = value1 - case_when(is.na(value3) ~ value2, TRUE ~ value3))
      id value1 value2 value3 diff
    1  1     10      9      4    6
    2  2     12      5      8    4
    3  3     11      6      7    4
    4  4     15     10     NA    5
    5  5     16      8      9    7
    6  6     14     10     NA    4
    7  7     14      6      5    9
    8  8     11      8     NA    3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-27
      • 2017-08-31
      • 1970-01-01
      • 1970-01-01
      • 2019-11-09
      • 2023-03-21
      相关资源
      最近更新 更多