【问题标题】:R : creating a variable conditionally if another variable increments by oneR:如果另一个变量增加一,则有条件地创建一个变量
【发布时间】:2023-03-15 20:17:01
【问题描述】:

我目前在 R 中使用 data.table,并且我有如下数据集:

ID   mon   age
1    1     22
1    2     56
1    5     106
2    1     34
2    3     65
2    4     76

我想创建一个名为 diff 的变量,仅当 mon 变量递增 1 时才计算每个 ID 观察值中的年龄差异。如果它不递增 1,那么我希望 diff 等于 NA。

这是我希望数据集的样子:

ID   mon   age   diff
1    1     22    NA
1    2     56    34
1    5     106   NA
2    1     34    NA
2    3     65    NA
2    4     76    11

我知道这需要某种类型的 if-else 语句,但我不确定如何利用 if-else 语句来遍历每个观察结果并检查 mon 变量是否仅增加 1。任何见解将不胜感激。

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    我们可以按'ID'分组,取'age'的相邻元素的difference,并乘以用diff创建的逻辑向量,将'mon'改为NA,这样那些有超过 1 个差异变为 NA

    library(dplyr)
    df1 %>% 
        group_by(ID) %>% 
         mutate(diff =  c(NA, diff(age)) * c(NA, NA^(diff(mon) != 1)))
    # A tibble: 6 x 4
    # Groups:   ID [2]
    #     ID   mon   age  diff
    #  <int> <int> <int> <dbl>
    #1     1     1    22    NA
    #2     1     2    56    34
    #3     1     5   106    NA
    #4     2     1    34    NA
    #5     2     3    65    NA
    #6     2     4    76    11
    

    【讨论】:

    • 这成功了!你能解释一下最后一行是什么意思吗?具体来说,“c(NA, diff(age)) * c(NA, NA^(diff(mon) !=1)))
    • @boodaloo1 谢谢,我添加了一些解释。你可以查看v1 &lt;- c(1, 2, 5); diff(v1) != 1NA^(diff(v1) != 1
    【解决方案2】:

    你可以使用shift获取mon之前的值,并检查差值是否为1。

    library(data.table)
    df[, diff:= ifelse(mon - shift(mon) == 1, age - shift(age), NA), ID] 
    df
    
    #   ID mon age diff
    #1:  1   1  22   NA
    #2:  1   2  56   34
    #3:  1   5 106   NA
    #4:  2   1  34   NA
    #5:  2   3  65   NA
    #6:  2   4  76   11        
    

    或者类似地在dplyr我们可以使用lag

    library(dplyr)
    
    df %>%
      group_by(ID) %>%
      mutate(diff = if_else(mon - lag(mon) == 1, age- lag(age), NA_integer_))
    

    【讨论】:

      猜你喜欢
      • 2015-04-05
      • 1970-01-01
      • 2016-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多