在R中如何将DataFrame按name列转换为多列(处理unk_*列)
解决方法
你可以用tidyr包的pivot_longer + pivot_wider组合来实现这个转换,步骤如下:
- 先把所有以
unk_开头的列转成长格式,保留name列作为变量标识:
library(tidyverse) # 原始数据 my_df = tibble(name = c('car', 'mileage', 'year'), unk_1 = c('toyota', '1000', '2022'), unk_2 = c('hyundai', '50', '2024')) # 第一步:转成长格式 long_df <- my_df %>% pivot_longer(cols = starts_with("unk_"), names_to = "temp_id", values_to = "value")
这一步会生成包含name、temp_id、value三列的长表,每个unk_列的内容被拆分成多行。
- 再将长表转回宽格式,用
name列的值作为新的列名:
final_df <- long_df %>% pivot_wider(names_from = name, values_from = value) %>% select(-temp_id) # 移除临时标识列
执行完后,final_df就是你想要的格式:
# A tibble: 2 × 3 car mileage year <chr> <chr> <chr> 1 toyota 1000 2022 2 hyundai 50 2024
补充说明
starts_with("unk_")会自动匹配所有以unk_开头的列,不管有40个还是更多,都不需要手动列出来;- 如果需要保留
temp_id列(比如记录原始列的来源),可以去掉select(-temp_id)这一步。
内容的提问来源于stack exchange,提问作者Beans On Toast
相关产品推荐
相关产品推荐

