R 数据转换:数据帧到用 0 和 1 填充的矩阵

R Data transformation: dataframe to matrix filled with 0 and 1

我希望将长数据格式转换为宽数据格式,但“signatories”列的值与新列名称不完全相同。

我有一个数据框,其中包含法案编号及其签署人(参议员)的姓名。如果参议员签署了一项法案,则他们是数据框中的一行,其中包含法案编号和相关参议员的姓名。所有没有在法案编号旁边列出名字的参议员都没有签署法案。

我想构建一个矩阵,行为法案编号,列为参议员姓名,仅填充 1 和 0。 1 表示给定的参议员已经签署了一项法案,0 表示他们没有。

ex <- data.frame(billno = c(715851, 715851, 715851,715852, 715852, 715852, 715852, 715852, 715852), signatories = c("Ben", "Lisa", "Roger", "Louise", "Macy", "John", "Jake", "James", "Ben"))

Senatornames <- c("Ben", "Lisa", "Roger", "Louise", "Macy", "John", "Jake", "James", "Julian", "Ayn")

#current output is this 
#  billno signatories
#1 715851         Ben
#2 715851        Lisa
#3 715851       Roger
#4 715852      Louise
#5 715852        Macy
#6 715852        John
#7 715852        Jake
#8 715852       James
#9 715852         Ben

#I want something like this. How do I arrive at this result? 
#  billno Ben   Lisa    Roger   Louise   Macy   John   Jake   James    Ayn
#1 715851  1      1       1       0        0      0       0      0      0
#2 715852  1      0       0       1        1      1       1      1      0

非常感谢!!

你可以这样做:

table(ex)
#>        signatories
#> billno   Ben Jake James John Lisa Louise Macy Roger
#>   715851   1    0     0    0    1      0    0     1
#>   715852   1    1     1    1    0      1    1     0

或者,如果您想以 tidyverse 风格进行操作并留下一个数据框,整个过程可以通过以下方式完成:

tidyr::pivot_wider(as.data.frame(table(ex)), 
                   names_from  = "signatories", 
                   values_from = "Freq")
#> # A tibble: 2 x 9
#>   billno   Ben  Jake James  John  Lisa Louise  Macy Roger
#>   <fct>  <int> <int> <int> <int> <int>  <int> <int> <int>
#> 1 715851     1     0     0     0     1      0     0     1
#> 2 715852     1     1     1     1     0      1     1     0

下一个代码可以让您接近您想要的。我使用了您提供的矢量来创建 full_join() 以便所有值都可以显示。这里的代码:

library(tidyverse)
#Dataframe
df <- data.frame(signatories=Senatornames,stringsAsFactors = F)
#Code
ex1 <- ex %>% mutate(Value=1) %>%
  full_join(df) %>%
  fill(billno) %>%
  pivot_wider(names_from = signatories,values_from=Value) %>%
  replace(is.na(.),0)

输出:

# A tibble: 2 x 11
  billno   Ben  Lisa Roger Louise  Macy  John  Jake James Julian   Ayn
   <dbl> <dbl> <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl> <dbl>  <dbl> <dbl>
1 715851     1     1     1      0     0     0     0     0      0     0
2 715852     1     0     0      1     1     1     1     1      0     0