如何将重复行转换为唯一列并填充对应值?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
相关产品推荐
相关产品推荐

