我有一个包含三列的数据框:
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 的代码的列表。
感谢您的指导。
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
我没有从你的问题中得知你是否希望每列包含相同的代码。
如果是,则以下操作应该有效:
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
>
aggregate(code ~ responseid, data = Data[-2], FUN = I)