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

如何将重复行转换为唯一列并填充对应值?R语言数据框转换

嘿,这事儿不难,咱们用两种方法都能轻松搞定这个数据框转换需求,我给你详细说说:

首先先确认你的原始数据框:

df1 <- data.frame(Client = c("Bob", "Bob", "John", "John", "John", "Mary", "Mary", "Mary", "Mary"), 
                  Product = c("House", "Car", "Shoes", "Food", "House", "Computer", "Furniture", "Shoes", "Clothes"))

方法一:用tidyverse的pivot_wider(推荐,代码简洁直观)

先确保你装了tidyr包(没装的话先跑install.packages("tidyr")),然后用下面的代码:

library(tidyr)
library(dplyr) # 用来调整行顺序

df2 <- df1 %>%
  # 把长格式转宽格式:列名取自Client列,单元格值取自Product列,空值用NA填充
  pivot_wider(names_from = Client, values_from = Product, values_fill = NA) %>%
  # 按照Product名称排序,和目标结构的行顺序一致
  arrange(Product) %>%
  # 把Product列转成行名,匹配你要的格式
  column_to_rownames(var = "Product")

运行完这段代码,你得到的df2就完全符合要求了:行是所有出现过的Product,列是各个Client,对应位置有该产品就填Product名称,没有就显示NA。

方法二:用base R的reshape函数(无需额外装包)

如果不想加载tidyverse,用base R自带的函数也能实现:

# 长转宽,指定以Product为唯一标识,Client为列分组依据
df2 <- reshape(df1, idvar = "Product", timevar = "Client", direction = "wide")
# 去掉列名自动生成的"Product."前缀
names(df2) <- sub("Product.", "", names(df2))
# 按照Product名称排序行
df2 <- df2[order(df2$Product), ]
# 把Product列设为行名,再删除原Product列
rownames(df2) <- df2$Product
df2$Product <- NULL

两种方法得到的结果完全一致,你可以根据自己的使用习惯选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:52:22