R语言如何基于现有dataframe多列创建指定结构新表
R语言从宽表生成对应id-fruit映射长表实现方法
你需要的转换本质是宽表转长表操作:把col1/col2/col3三列的数值统一提取为id列,每个数值对应的行保留原有的fruit值,最后按id排序即可。以下是两种常用实现方式:
方法1:Base R 原生实现(无需安装额外包)
不需要依赖第三方包,直接用R内置的reshape函数即可完成转换:
# 构造示例原始dataframe,你用自己的真实数据替换这部分即可 df <- data.frame( fruit = c("apple", "banana", "lime", "orange", "grape"), col1 = c(1,4,8,2,7), col2 = c(3,7,10,6,5), col3 = c(2,3,5,8,10) ) # 宽转长 long_df <- reshape( df, direction = "long", varying = c("col1", "col2", "col3"), idvar = "fruit", timevar = NULL ) # 整理为目标结构 result <- long_df[, c("col1", "fruit")] colnames(result)[1] <- "id" # 重命名为id,你已经掌握这步可自行调整 result <- result[order(result$id), ] # 按id升序排序,匹配示例顺序 rownames(result) <- NULL # 清除自动生成的冗余行名
方法2:tidyverse 实现(代码更简洁,适合日常数据处理)
如果平时用tidyverse生态做数据处理,用tidyr包的pivot_longer函数逻辑更直观:
# 首次使用先运行安装:install.packages("tidyverse") library(tidyverse) result <- df %>% pivot_longer( cols = starts_with("col"), # 选中所有col开头的数值列 values_to = "id" # 数值统一存入id列 ) %>% select(id, fruit) %>% # 只保留需要的两列 arrange(id) # 按id排序
两种方法输出结果完全一致,和你给出的示例匹配:比如id=3对应apple(col2=3)、banana(col3=3);id=5对应lime(col3=5)、grape(col2=5),所有重复id对应多个fruit的行都会被完整保留,你示例中未展示全的行(比如id=2对应orange、id=6对应orange等)也会按规则生成。
内容的提问来源于stack exchange,提问作者chrtwegang
相关产品推荐
相关产品推荐

