问题标题可能无法完全反射(reflect)我的问题,这也许就是我无法为我的问题找到解决方案的原因。我读过类似的问题(例如 Assign a value to column based on condition across rows 或 R: 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 和 0 测量,则另一个虚拟变量取值 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 测量的,因此法国观测值取值 0。值1,其余取值0(注意US也取值0,因为它是在时间1、2和3测量的,而不仅仅是在时间2和3测量的)。
我尝试在 tidyverse 中使用 if_else 创建一个虚拟对象,例如
DummyTime123 = ifelse(国家/地区=国家/地区,时间= 1 & 时间= 2 & 时间= 3)
但这不起作用,相当合理,因为在时间 1、2 和 3 没有测量任何单个观察值。相反,我想根据该观察值的一列(国家/地区)是否为该观察值创建一个虚拟值)是在多次(特定的)时间进行测量的。我还考虑过我的数据框可能不整洁,但我看不出如何,而且我不认为这就是问题所在。当然,我可以手动执行此操作(这就是我到目前为止所做的),但由于数据集相当大,我想找到一个自动化的解决方案。
有没有人能解决这个问题?如果 tidyverse 中有一个解决方案,那就太好了,但当然任何解决方案都会有帮助。
最佳答案
与 tidyverse
您可以尝试以下操作。
使用group_by
与 Country
考虑所有Time
每个Country
内的值.
满足DummyTime123
标准,您需要all
Time
中的 1、2 和 3 值Country
内的值。如果TRUE
,然后使用 +
这变为 1。
对于DummyTime23
,听起来您想要 Time
中的 2 和 3但不想any
Time
的值为 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 - 如何根据R中两列的值创建虚拟变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64667411/