【问题标题】:Create a new variable based on other columns values根据其他列值创建一个新变量
【发布时间】:2021-10-15 06:04:21
【问题描述】:

我有一个 paneldata 数据框结构,如下所示:

df <- data.frame("id" = c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3),          
             "Status_2014" = c(1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0),
             "Status_2015" = c(0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0),
             "Status_2016" = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0))

我想生成一个新的虚拟变量,如果行在三列中的任何一列中包含 1,则取值为 1,否则为 0。最终应该是这样的:

df <- data.frame("id" = c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3),          
             "Status_2014" = c(1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0),
             "Status_2015" = c(0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0),
             "Status_2016" = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 
             "Final_status" = c(1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0))

Can anyone help me achieve this?

【问题讨论】:

    标签: r dataframe dplyr panel-data


    【解决方案1】:

    我们可以在 starts_with 'Status' 的列上使用 if_any 来检查一行中的任何 1 值,如果有一个则返回 TRUE @

    library(dplyr)
    df %>%
       mutate(Final_status = +(if_any(starts_with('Status'),  ~ . ==1)))
    

    -输出

    id Status_2014 Status_2015 Status_2016 Final_status
    1   1           1           0           0            1
    2   1           1           0           0            1
    3   1           1           0           0            1
    4   1           1           0           0            1
    5   2           0           1           0            1
    6   2           0           1           0            1
    7   2           0           1           0            1
    8   2           0           1           0            1
    9   3           0           0           0            0
    10  3           0           0           0            0
    11  3           0           0           0            0
    12  3           0           0           0            0
    

    或者使用来自base RrowSums

    df$Final_status <- +(rowSums(df[-1] > 0) > 0)
    

    【讨论】:

    • 运行建议的代码时,我只得到错误:“找不到函数“if_any”” - 有什么建议吗?
    • 问题出在包版本上。代码效果很好。谢谢!
    【解决方案2】:

    您编写一个 if 条件来将变量定义为 1 或 0,在此条件内,最直接的方法是 dplyr 管道。

    我脑子里没有 dplyr 语法,很长时间没用过,但是 dplyr 是你想要的。

    https://www.rstudio.com/wp-content/uploads/2015/02/data-wrangling-cheatsheet.pdf

    最好的问候

    【讨论】: