首页 > 解决方案 > 如何根据 R 中两列的值创建虚拟变量?

问题描述

问题标题可能无法完全反映我的问题,这也许就是我无法为我的问题提出解决方案的原因。我已经阅读了类似的问题(例如,根据跨行的条件为列分配值R:根据另一列中存在一列的值生成一个虚拟变量)和关于在 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 & time = 2 & time = 3)

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

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

标签: rtidyversedummy-variable

解决方案


tidyverse您可以尝试以下方法。

使用group_bywithCountry考虑Time每个 中的所有值Country

要满足DummyTime123条件,您需要在 a 中的值中包含all1、2 和 3 的TimeCountry。如果TRUE, 则使用+this 变为 1。

对于DummyTime23,听起来您想要 2 和 3 inTime但不希望any的值为Time1。使用&您可以确保满足两个条件。

让我知道这是否提供了预期的结果。

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

推荐阅读