group_by 和pivot_wider 组合

问题描述 投票:0回答:3

我有一个包含三列的数据框:

responseid = c(rep("123xyz", 6), rep("456abc", 6), rep("789def", 6))
year = c(rep(2022, 6), c(rep(2021, 6), c(rep(2022, 6)) 
code = c(000, 0500, 0033, 0036, 0102, 0486, 000, 0500, 0032, 0039, 0101, 0466, 000, 0500, 0012, 0049, 0111, 0446)
Data = data.frame(responseid , year , code)

我希望它每行都显示为唯一的responseid,并且与该responseid相关的每个代码作为一列:

响应ID 代码1 代码2 代码3 代码4 代码5 代码6
123xyz 000 0500 0033 0036 0102 0486
456abc 000 0500 0032 0039 0101 0466

我尝试过按responseid然后pivot_wider进行分组,但这似乎不起作用。我最终将每个响应 ID 作为一列,并在每个单元格中列出一个包含该响应 ID 的代码的列表。

感谢您的指导。

r pivot group
3个回答
1
投票

data.table
方法

library(data.table)
dcast(setDT(Data), 
      responseid ~ paste0("code", Data[, seq_len(.N), by=responseid]$V1), 
      value.var = "code")
# Key: <responseid>
#    responseid code1 code2 code3 code4 code5 code6
#        <char> <num> <num> <num> <num> <num> <num>
# 1:     123xyz     0   500    33    36   102   486
# 2:     456abc     0   500    32    39   101   466
# 3:     789def     0   500    12    49   111   446

0
投票

我没有从你的问题中得知你是否希望每列包含相同的代码。

如果是,则以下操作应该有效:

library(tidyr)
library(dplyr)

responseid = c(rep("123xyz", 6), rep("456abc", 6), rep("789def", 6)) 
year = c(rep(2022, 6), rep(2021, 6), rep(2022, 6))
code = c(000, 0500, 0033, 0036, 0102, 0486, 000, 0500, 0032, 0039, 0101, 0466, 000, 0500, 0012, 0049, 0111, 0446) 
Data = data.frame(responseid , year , code = as.character(code))

Data_name <- Data |> 
  mutate(name = paste("code", code, sep = "_"))

Data_piv <- Data_name |> 
  pivot_wider(id_cols = responseid,
              values_from = code,
              names_from = name)
> Data_piv
# A tibble: 3 × 15
  responseid code_0 code_500 code_33 code_36 code_102 code_486 code_32 code_39 code_101 code_466 code_12
  <chr>      <chr>  <chr>    <chr>   <chr>   <chr>    <chr>    <chr>   <chr>   <chr>    <chr>    <chr>  
1 123xyz     0      500      33      36      102      486      NA      NA      NA       NA       NA     
2 456abc     0      500      NA      NA      NA       NA       32      39      101      466      NA     
3 789def     0      500      NA      NA      NA       NA       NA      NA      NA       NA       12     
# ℹ 3 more variables: code_49 <chr>, code_111 <chr>, code_446 <chr>

否则,这应该可行:

Data_name2 <- Data |> 
  group_by(responseid) |>
  mutate(i = 1:n()) |>
  mutate(name = paste("code", i, sep = "_"))

Data_piv2 <- Data_name2 |> 
  pivot_wider(id_cols = responseid,
              values_from = code,
              names_from = name)
> Data_piv2
# A tibble: 3 × 7
# Groups:   responseid [3]
  responseid code_1 code_2 code_3 code_4 code_5 code_6
  <chr>      <chr>  <chr>  <chr>  <chr>  <chr>  <chr> 
1 123xyz     0      500    33     36     102    486   
2 456abc     0      500    32     39     101    466   
3 789def     0      500    12     49     111    446   
> 

0
投票

基地

aggregate(code ~ responseid, data = Data[-2], FUN = I)
© www.soinside.com 2019 - 2024. All rights reserved.