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

标签 r tidyverse dummy-variable

问题标题可能无法完全反射(reflect)我的问题,这也许就是我无法为我的问题找到解决方案的原因。我读过类似的问题(例如 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 和 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_byCountry考虑所有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/

相关文章:

python - 值错误: Columns must be same length as key

python - 如何根据用户输入(只有一条记录)创建用于预测的虚拟变量?

r - 是否可以在 Emacs ESS 中获得类似于 Rstudio 中可用的代码完成的代码?

删除重复的列对,基于 2 列对行进行排序

r - 绘制 Gamma 概率密度函数

r - 如何在 purrr 中使用 rlang

r - 如何在 R 中将年份映射到随后的几十年?

r - 如何为 R 中的特定范围创建虚拟变量?

r - 使用 Ggvis 绘制 LOESS (STL) 分解图

r - 包含 R > 3.4.0 中的显式 NA 的表