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
我希望将长数据格式转换为宽数据格式,但“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