【发布时间】:2025-12-15 15:55:02
【问题描述】:
我正在处理一个凌乱的选民文件。考虑以下tibble:
library(dplyr)
library(tidyr)
dat <- tibble(
id = factor(c("A","B","C","D","E")),
demographic_info1 = round(rnorm(5),2),
demographic_info2 = round(rnorm(5),2),
election_1 = c(NA,"GN2016","GN2016","SE2016","GN2008"),
election_2 = c(NA,"MT2014","GN2012","GN2016","GN2004"),
election_3 = c(NA,NA,NA,"MT2014","GN2000"),
election_4 = c(NA,NA,NA,"GN2012",NA),
election_5 = c(NA,NA,NA,"MT2010",NA),
)
看起来像:
# A tibble: 5 x 8
id demographic_info1 demographic_info2 election_1 election_2 election_3 election_4 election_5
<fctr> <dbl> <dbl> <chr> <chr> <chr> <chr> <chr>
1 A -1.50 0.81 <NA> <NA> <NA> <NA> <NA>
2 B -1.84 -0.64 GN2016 MT2014 <NA> <NA> <NA>
3 C 1.66 -0.10 GN2016 GN2012 <NA> <NA> <NA>
4 D 0.91 -0.08 SE2016 GN2016 MT2014 GN2012 MT2010
5 E 0.04 -1.15 GN2008 GN2004 GN2000 <NA> <NA>
- 每个
id都是选民的唯一标识符。 -
demographic_info的两个列是填充物,只是为了证明我希望在对数据进行整形时保留这些值。
election_1 到 election_5 列是我感兴趣的。数据的结构使得文件包含某人最近参加的 5 次选举。election_1 是最近的,election_5 是最近的。
请注意,A 从来没有投票,而D 总是这样做。我想做的是将这些列变成许多变量:SE2016、GN2016、MT2014、GN2012 等;即election_1 到election_5 中的所有值。我希望这些变量中的每一个都是TRUE 或FALSE 的变量,用于判断该人是否出现在民意调查中。我试过这段代码:
dat %>% # take data
gather(election, race, election_1:election_5) %>% # gather by election
mutate(temp=TRUE) %>% # make new variable that is all TRUE
select(-election) %>% # drop election variable
spread(race, temp, fill=FALSE) # spread by this all TRUE variable, fill all NAs as FALSE
但是,spread 抛出错误:
Error: Duplicate identifiers for rows (1, 6, 11, 16, 21), (12, 17, 22), (13, 18, 23), (20, 25)
这是因为race 变量的每个值都有多个条目。我在执行spread 之前尝试过group_by(id),但抛出了同样的错误。
我希望生成的 tibble 看起来像:
# A tibble: 5 x 11
id demographic_info1 demographic_info2 SE2016 GN2016 MT2014 GN2012 MT2010 GN2008 GN2004 GN2000
<fctr> <dbl> <dbl> <lgl> <lgl> <lgl> <lgl> <lgl> <lgl> <lgl> <lgl>
1 A -0.91 -0.56 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
2 B 1.24 -1.78 FALSE TRUE TRUE FALSE FALSE FALSE FALSE FALSE
3 C 0.61 0.11 FALSE TRUE FALSE TRUE FALSE FALSE FALSE FALSE
4 D 2.43 -0.53 TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE
5 E -1.40 -1.23 FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE
【问题讨论】:
-
在执行
spread之前需要按组创建序列列 -
@akrun
id变量不算作序列列吗?不确定我是否关注。