如何在R语言中对指定列进行透视?偏好tidyverse解决方案
数据透视解决方案(tidyverse实现)
我已多次尝试仍未成功,恳请各位帮忙解决。现有如下数据:
df <- structure(list(type = c("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"), female = c(NA, 3, NA, 1, NA, 2, 2, 1, 16, 43, 10), prop_total_female = c(NA, 0.04, NA, 0.01, NA, 0.03, 0.03, 0.01, 0.21, 0.55, 0.13), male = c(2, NA, 2, NA, 1, 8, 1, NA, 11, 34, 12), prop_total_male = c(0.03, NA, 0.03, NA, 0.01, 0.11, 0.01, NA, 0.15, 0.48, 0.17)), row.names = c(NA, -11L), class = c("tbl_df", "tbl", "data.frame"))
数据表格预览:
| type | female | prop_total_female | male | prop_total_male |
|---|---|---|---|---|
| a | NA | NA | 2 | 0.03 |
| b | 3 | 0.04 | NA | NA |
| c | NA | NA | 2 | 0.03 |
| d | 1 | 0.01 | NA | NA |
| e | NA | NA | 1 | 0.01 |
| f | 2 | 0.03 | 8 | 0.11 |
| g | 2 | 0.03 | 1 | 0.01 |
| h | 1 | 0.01 | NA | NA |
| i | 16 | 0.21 | 11 | 0.15 |
| j | 43 | 0.55 | 34 | 0.48 |
| k | 10 | 0.13 | 12 | 0.17 |
我希望对数据进行透视,将male和female列合并为gender列,将prop_total_female和prop_total_male列合并为prop列,最终得到包含type、gender、prop三列的数据框。偏好使用tidyverse工具的解决方案。
另外,对@user438383说一句:就算你要标记我的问题为重复,也请先给出解决方案再继续你的清闲生活。
解决方案代码
library(tidyverse) # 执行数据透视转换 result <- df %>% pivot_longer( cols = -type, names_to = c(".value", "gender"), # 匹配两种列名格式:直接的性别列(female/male)和带前缀的prop列(prop_total_female/male) names_pattern = "(prop_total_)?(female|male)" ) %>% # 只保留需要的列,并重命名prop_total为prop select(type, gender, prop = prop_total) %>% # 过滤掉prop为空的无效行 filter(!is.na(prop)) # 查看结果 print(result)
结果示例
转换后的数据框结构如下(部分行):
| type | gender | prop |
|---|---|---|
| a | male | 0.03 |
| b | female | 0.04 |
| c | male | 0.03 |
| d | female | 0.01 |
| e | male | 0.01 |
| f | female | 0.03 |
| f | male | 0.11 |
内容的提问来源于stack exchange,提问作者aerw4
相关产品推荐
相关产品推荐

