如何将含多组关联列的DataFrame从宽格式转长格式(R语言)
调查数据宽转长:多问题关联对应颜色的解决方案
这是我此前Stack Overflow问题的跟进提问,虽然有类似问题,但我的数据结构存在差异。
我手头有一份调查数据:受访者先选择喜欢的颜色(Q1字段为逗号分隔的颜色字符串),随后针对所选的每一种颜色回答多个后续问题(Q2、Q3),数据集的列名采用「问题描述 - 颜色」的组合格式。示例数据如下:
df <- data.frame( ID = 1:3, Q1 = c("Purple, Red, Blue", "Red, Blue, Yellow", "Red"), "Q2: Is it your favorite color? - Purple" = c("Average", NA, NA), "Q2: Is it your favorite color? - Red" = c("No", "No", "Average"), "Q2: Is it your favorite color? - Blue" = c("Yes", "No", NA), "Q2: Is it your favorite color? - Yellow" = c(NA, "Average", NA), "Q3: Why did you choose this color? - Purple" = c("Pretty", NA, NA), "Q3: Why did you choose this color? - Red" = c("Pretty", "Vibrancy", "Beautiful"), "Q3: Why did you choose this color? - Blue" = c("Beautiful", "Vibrancy", NA), "Q3: Why did you choose this color? - Yellow" = c(NA, "Pretty", NA), check.names = FALSE)
我期望将数据转换为每行对应单个ID的单个颜色,并关联对应的Q2、Q3值的长格式,结果如下:
| ID | Q1 | Q2 | Q3 |
|---|---|---|---|
| 1 | Purple | Average | Pretty |
| 1 | Red | No | Pretty |
| 1 | Blue | Yes | Beautiful |
| 2 | Red | No | Vibrancy |
| 2 | Blue | No | Vibrancy |
| 2 | Yellow | Average | Pretty |
| 3 | Red | Average | Beautiful |
我之前写的代码只能处理Q1和Q2的转换,无法扩展到Q3,代码如下:
pivot_longer(df, cols = -c(ID, Q1), values_to = "Q2") |> tidyr::separate_longer_delim(Q1, delim = stringr::regex(",\\s*")) |> filter(sub(".* ", "", name) == Q1) |> select(-name)
现在寻求可以同时支持Q2、Q3的宽转长解决方案。
内容的提问来源于stack exchange,提问作者Ekd
相关产品推荐
相关产品推荐

