基于R语言DataFrame生成含Amenities与Name列的新数据集
R语言转换DataFrame生成指定列的解决方案
现有如下R语言DataFrame:
df<-structure(list(state = c("West Bengal", "West Bengal", "West Bengal", "West Bengal", "West Bengal"), nn_hospital = c("Khundkuri Hospital", "Khundkuri Hospital", "Mankar Rural Hospital", "Khundkuri Hospital", "Khundkuri Hospital"), distance_nn_hospital = c(8949.68646563084, 17217.1419457099, 16939.2318150416, 15812.9872649418, 1408.372117616 ), nn_bank = c("contai", "contai", "Allahabad Bank", "contai", "contai"), distance_nn_bank = c(13959.9950089655, 20598.4763042432, 19688.6296071566, 20537.3799009137, 11385.8738290783)), class = "data.frame", row.names = c(NA, 5L))
需要生成仅包含Amenities和Name两列的新DataFrame:
Amenities列取值为"nn_bank"或"nn_hospital"Name列对应原DataFrame中nn_bank或nn_hospital列的具体名称
方法一:使用tidyr包(推荐)
借助tidyr的pivot_longer函数快速实现宽表转长表,筛选出目标列:
# 若未安装tidyr包,先执行安装 # install.packages("tidyr") library(tidyr) # 转换并提取目标列 new_df <- df %>% pivot_longer( cols = c(nn_hospital, nn_bank), # 指定要转换的列 names_to = "Amenities", # 原列名存入Amenities列 values_to = "Name" # 原列值存入Name列 ) %>% select(Amenities, Name) # 只保留目标两列 # 查看结果 print(new_df)
方法二:Base R实现(无需额外包)
通过手动构建子数据框再合并的方式实现:
# 构建医院相关数据框 hospital_df <- data.frame( Amenities = rep("nn_hospital", nrow(df)), Name = df$nn_hospital ) # 构建银行相关数据框 bank_df <- data.frame( Amenities = rep("nn_bank", nrow(df)), Name = df$nn_bank ) # 合并两个数据框 new_df <- rbind(hospital_df, bank_df) # 查看结果 print(new_df)
两种方法最终得到的new_df结构完全符合需求,示例输出如下:
Amenities Name 1 nn_hospital Khundkuri Hospital 2 nn_hospital Khundkuri Hospital 3 nn_hospital Mankar Rural Hospital 4 nn_hospital Khundkuri Hospital 5 nn_hospital Khundkuri Hospital 6 nn_bank contai 7 nn_bank contai 8 nn_bank Allahabad Bank 9 nn_bank contai 10 nn_bank contai
内容的提问来源于stack exchange,提问作者firmo23
相关产品推荐
相关产品推荐

