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

基于指定列值将R语言Dataframe重组为多列的技术问询

解决方案:将DataFrame按分组重组为多列

嘿,这个需求我经常碰到,用R来处理超简单!我给你两种方法,一种是用tidyverse的便捷工具,另一种是纯base R的写法,你看哪个顺手就用哪个~

方法一:用tidyverse工具包(推荐)

tidyverse里的dplyr和tidyr组合能快速搞定这个重组需求,步骤清晰易懂:

  1. 首先加载tidyverse包(如果没安装的话先跑install.packages("tidyverse")):
library(tidyverse)
  1. 给每个x分组添加行索引,用来对齐后续的行位置:
dataframe <- dataframe %>%
  group_by(x) %>%
  mutate(row_id = row_number()) %>% # 给每个x组内的y值编序号
  ungroup()
  1. 转成宽格式,自动用NA填充缺失的位置,最后去掉不需要的列:
new_df <- dataframe %>%
  pivot_wider(names_from = x, values_from = y) %>% # 以x为列名,y为对应值
  select(-row_id, -z) # 删掉临时的row_id和不需要的z列

运行后得到的结果完全符合你的要求:

new_df
#>   apple orange banana strawberry
#> 1     a      c      g          i
#> 2     d      e      h       <NA>
#> 3     b      f   <NA>       <NA>

方法二:纯Base R写法

如果你不想加载额外包,用Base R也能实现:

# 先获取x的唯一值作为新列名
unique_x <- unique(dataframe$x)

# 对每个x提取对应的y值,并用NA填充到最长分组的长度
max_length <- max(table(dataframe$x)) # 找到最大的分组行数
list_y <- lapply(unique_x, function(val) {
  y_vals <- dataframe$y[dataframe$x == val]
  length(y_vals) <- max_length # 用NA补全长度
  y_vals
})

# 把列表转成DataFrame并设置列名
new_df_base <- as.data.frame(do.call(cbind, list_y))
colnames(new_df_base) <- unique_x

运行后得到的结果和方法一完全一致哦~

内容的提问来源于stack exchange,提问作者ASF

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:17:49