【问题标题】:How to create dummy variable based on the value of two columns in R?如何根据 R 中两列的值创建虚拟变量?
【发布时间】:2020-11-03 17:11:28
【问题描述】:

问题标题可能无法完全反映我的问题,这也许是我无法为我的问题找到解决方案的原因。我已经阅读了类似的问题(例如,Assign a value to column based on condition across rowsR: Generate a dummy variable based on the existence of one column' value in another column)和在 R 中创建虚拟变量的在线指南(我对 R 很陌生),但似乎没有人解决我的问题,或者我只是看不出怎么做。我有一个这样的数据框:

df <- data.frame("Country" = c("US", "US", "US", "US", "IT", "IT", "IT","FR","FR"),          
             "Time" = c(1, 1, 2, 3, 1, 2, 1, 2, 3))

数据框更复杂,但每一行都是在给定时间对一个国家/地区的观察。我想创建一个虚拟变量,如果分配给该观察的国家是在时间 1、2 3 和 0 测量的,则该虚拟变量取值为 1,如果该国家是在时间测量,则另一个虚拟变量取值为 1矩 2 和 3 但不是 1,否则为 0。所以数据框看起来像:

df2 <- data.frame("Country" = c("US", "US", "US", "US", "IT", "IT", "IT","FR","FR"),          
              "Time" = c(1, 1, 2, 3, 1, 2, 1, 2, 3),
              "DummyTime123" = c(1, 1, 1, 1, 0, 0, 0, 0, 0),
              "DummyTime23" = c(0, 0, 0, 0, 0, 0, 0, 1, 1))

因此,由于 US 是在时间 1、2 和 3 处测量的,因此美国的观测值取值为 1,而其余的观测值取值为 0。但是,由于 FR 是在时间 2 和 3 处测量的,因此法国的观测值取值为取值为 1,其余取值为 0(请注意,US 也取值为 0,因为它是在时间 1、2 和 3 测量的,而不仅仅是在时间 2 和 3)。

我曾尝试在 tidyverse 中使用 if_else 创建一个虚拟对象,例如

DummyTime123 = ifelse(country = country, time = 1 &amp; time = 2 &amp; time = 3)

但这不起作用,非常合理,因为在时间 1、2 和 3 没有测量单个观察值。相反,我想根据该观察值的一列的值是否为该观察值创建一个虚拟变量(国家) 是在几个(和特定的)时间测量的。我还考虑过我的数据框可能不整洁,但我看不出是怎么回事,我认为这不是问题所在。当然,我可以手动执行此操作(到目前为止我就是这样做的),但是由于数据集非常大,我想找到一个自动化的解决方案。

¿有人有解决这个问题的方法吗?如果在 tidyverse 中有解决方案,那就太好了,但当然任何解决方案都会有所帮助。

【问题讨论】:

    标签: r tidyverse dummy-variable


    【解决方案1】:

    使用tidyverse,您可以尝试以下操作。

    使用group_byCountry 来考虑每个Country 中的所有Time 值。

    要满足DummyTime123 条件,您需要Country 内的Time 值中的all 值1、2 和3。如果TRUE,则使用+,这将变为1。

    对于DummyTime23,听起来您需要Time 中的2 和3,但不希望Timeany 值为1。使用&amp;,您可以确保满足这两个条件。

    如果这提供了预期的结果,请告诉我。

    library(tidyverse)
    
    df %>%
      group_by(Country) %>%
      mutate(DummyTime123 = +all(1:3 %in% Time),
             DummyTime23 = +(all(2:3 %in% Time) & !any(Time == 1)))
    

    输出

      Country  Time DummyTime123 DummyTime23
      <chr>   <dbl>        <int>       <int>
    1 US          1            1           0
    2 US          1            1           0
    3 US          2            1           0
    4 US          3            1           0
    5 IT          1            0           0
    6 IT          2            0           0
    7 IT          1            0           0
    8 FR          2            0           1
    9 FR          3            0           1
    

    【讨论】:

    • 抱歉回复晚了!我最近真的很忙,在我检查解决方案是否真的适用于我的数据框之前不想回答。实际上,您的解决方案非常完美且很有帮助!真的,非常感谢!我的问题现在完全解决了。我显然无法理解 group_by 函数的实际作用。
    • @CarlosGonzálezPoses 太棒了!很高兴听到。如果合适,请随时accept answer。我认为值得花时间学习dplyr——那里有很多资源(包括这个blog,它确实很好地讨论了group_by)。祝你好运!
    • 你好。该博客也非常有用!谢谢。我强烈建议对 dplyr 感兴趣的人使用它。
    猜你喜欢
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    • 2023-03-24
    相关资源
    最近更新 更多