如何根据 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_by
和 Country
来考虑每个 Country
.
中的所有 Time
值
要满足 DummyTime123
条件,您需要 Country
中 Time
值中的 all
值 1、2 和 3。如果 TRUE
,则使用 +
这将变为 1.
对于 DummyTime23
,听起来您想要 Time
中的 2 和 3,但不希望 Time
的 any
值为 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
问题标题可能没有完全反映我的问题,这可能是我无法为我的问题想出解决方案的原因。我已经阅读了关于在 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 但不是一个时刻 ,否则为 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_by
和 Country
来考虑每个 Country
.
Time
值
要满足 DummyTime123
条件,您需要 Country
中 Time
值中的 all
值 1、2 和 3。如果 TRUE
,则使用 +
这将变为 1.
对于 DummyTime23
,听起来您想要 Time
中的 2 和 3,但不希望 Time
的 any
值为 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