【问题标题】:How to create binary variable for each individual based on value in other variable?如何根据其他变量中的值为每个人创建二进制变量?
【发布时间】:2021-04-19 11:17:38
【问题描述】:

所以我有一个包含 4 个人的数据集。每个人都在不同的时间段内进行测量。在 R 中:

df = data.frame(cbind("id"=c(1,1,1,2,2,3,3,3,3,4,4), "t"=c(1,2,3,1,2,1,2,3,4,1,2), "x1"=c(0,1,0,1,0,0,1,0,1,0,0)))

我想创建变量 x2 来指示给定个体的变量 x1 中是否已经有 1,即它看起来像这样:

"x2" = c(0,1,1,1,1,0,1,1,1,0,0)

... 最好使用 dplyr 包。到目前为止,我已经来到这里:

new_df = df %>% dplyr::group_by(id) %>% dplyr::arrange(t) 

但不能从这一点移动...想要的结果在图片上。

【问题讨论】:

    标签: r dplyr tidyverse feature-engineering


    【解决方案1】:

    这是使用dplyr的一种方法:

    df %>% 
      arrange(id, t) %>%
      group_by(id) %>% 
      mutate(x2 = ifelse(row_number() >= min(row_number()[x1 == 1]), 1, 0))
    

    如果行号大于或等于x1 为1 的第一个行号,这将添加1;否则,它将添加一个 0。

    请注意,您会收到警告,因为至少有一组的值不是等于 1 的 x1

    另外,另一种选择,包括如果您想要 NA,其中没有 idx1 值为 1(例如,id 为 4):

    df %>% 
      arrange(id, t) %>%
      group_by(id) %>% 
      mutate(x2 = +(row_number() >= which(x1 == 1)[1]))
    

    输出

          id     t    x1    x2
       <dbl> <dbl> <dbl> <dbl>
     1     1     1     0     0
     2     1     2     1     1
     3     1     3     0     1
     4     2     1     1     1
     5     2     2     0     1
     6     3     1     0     0
     7     3     2     1     1
     8     3     3     0     1
     9     3     4     1     1
    10     4     1     0     0
    11     4     2     0     0
    

    【讨论】:

    • 谢谢。同时我想出了这个解决方案: new_df = df %>% dplyr::arrange(id, t) %>% dplyr::group_by(id) %>% dplyr::mutate("x2"=ifelse(cumsum(x1 )>0,1,0)) ...但我担心在出现问题时可能会弹出一些特殊情况。你觉得呢?
    • @pikachu 这应该可以。我编辑了另一种选择,如果x1 的值不等于1,则添加NA 以防万一。
    猜你喜欢
    • 1970-01-01
    • 2013-04-15
    • 1970-01-01
    • 2013-04-28
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    相关资源
    最近更新 更多