如何将数据框旋转得更宽,将数字变量(例如选举年)转换为二分变量

How do I pivot a data frame wider turning a variable of numbers (e.g. election years) into dichotomous variables

我有一个选举调查数据的数据框。一个变量列出选举年份,其他变量报告个人级别数据(例如投票选择、性别)。

如何将包含选举年的变量(在本例中为 var1)转换为一系列二分变量。 我可以通过一系列重新编码来做到这一点,但我想让 pivot_wider 在这里工作。

var1<-sample(seq(1,5, 1), size=500, replace=T)
var2<-sample(c("red", "orange"), size=500, replace=T)
var3<-sample(c(0,1), size=500, replace=T)
df<-data.frame(var1, var2, var3)
library(tidyverse)
df
df %>% 
  pivot_wider(., names_from=var1, values_from=var1)

是这样的吗?

library(dplyr)
library(tidyr)

df %>%  
  pivot_wider(id_cols = var1:var3, 
            names_from = var1, 
            values_from = var1, 
            values_fn = \(x) as.integer(length(x) > 0),
            values_fill = 0L,
            names_sort = T)
  var2    var3   `1`   `2`   `3`   `4`   `5`
  <chr>  <dbl> <int> <int> <int> <int> <int>
1 red        1     1     1     1     1     1
2 red        0     1     1     1     1     1
3 orange     1     1     1     1     1     1
4 orange     0     1     1     1     1     1

或求和:

df %>%  
  pivot_wider(id_cols = var1:var3, 
            names_from = var1, 
            values_from = var1, 
            values_fn = \(x) as.integer(sum(x)),
            values_fill = 0L,
            names_sort = T)
var2    var3   `1`   `2`   `3`   `4`   `5`
  <chr>  <dbl> <int> <int> <int> <int> <int>
1 red        1    27    56    54    84   165
2 red        0    20    50    90   128   115
3 orange     1    17    56    54    72   100
4 orange     0    27    70    78   108   135