You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 12:45:42