如何根据 R 中两列的值创建虚拟变量?

How to create dummy variable based on the value of two columns in R?

问题标题可能没有完全反映我的问题,这可能是我无法为我的问题想出解决方案的原因。我已经阅读了关于在 R 中创建虚拟变量的类似问题(例如 or )和 on-line 指南(我对 R 很陌生),但是 no-one 似乎解决了我的问题,或者也许我只是看不出如何。我有一个这样的数据框:

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 但不是一个时刻 ,否则为 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 测量的,因此法语observations 取值 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 中有针对此问题的解决方案,那就太好了,当然,任何解决方案都会有所帮助。

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

使用 group_byCountry 来考虑每个 Country.

中的所有 Time

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

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

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

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