我有一个数据框,它并不是真正的“长格式”,但它的格式比我想要的要长。我想将它压缩成一个“宽格式”,将与 id 相关的所有信息都放在一行中。现在,一些信息在每一行上重复(例如下面示例中的日期),而其他信息需要在合并行时保留(例如下面的类型列)。谢谢!
id <- c(1000, 1000, 1000, 1001, 1001, 1001)
type <- c("A", "B", "B", "C", "C", "A")
dates <- c("10/5/2019", "10/5/2019", "10/5/2019", "9/17/2020", "9/17/2020", "9/17/2020")
df <- as.data.frame(cbind(id, type, dates))
df
id type dates
1 1000 A 10/5/2019
2 1000 B 10/5/2019
3 1000 B 10/5/2019
4 1001 C 9/17/2020
5 1001 C 9/17/2020
6 1001 A 9/17/2020
我希望它看起来像这样:
另一个只使用 tidyverse
的选项:
library(tidyverse)
#Code
df %>% group_by(id) %>% mutate(idv=paste0('type.',1:n())) %>%
pivot_wider(names_from = idv,values_from=type)
输出:
# A tibble: 2 x 5
# Groups: id [2]
id dates type.1 type.2 type.3
<chr> <chr> <chr> <chr> <chr>
1 1000 10/5/2019 A B B
2 1001 9/17/2020 C C A
或者使用row_number()
(感谢@r2evans):
#Code 2
df %>% group_by(id) %>% mutate(idv=paste0('type.',row_number())) %>%
pivot_wider(names_from = idv,values_from=type)
输出:
# A tibble: 2 x 5
# Groups: id [2]
id dates type.1 type.2 type.3
<chr> <chr> <chr> <chr> <chr>
1 1000 10/5/2019 A B B
2 1001 9/17/2020 C C A