如何拆分dataframe多值列生成重复行 适配dcast频率矩阵构建
拆分多值字符串为独立行的简便实现
你要的拆分行操作不需要写复杂的自定义逻辑,直接用现成函数一行就能搞定,后续可以直接衔接dcast生成频率矩阵。
方案1:tidyverse 最简写法(推荐)
用tidyr包的separate_rows()函数,专门为这种分隔符拆分行的场景设计,自动对应保留其他列的重复值:
- 先加载依赖包、构造示例数据
library(tidyr) library(reshape2) df <- data.frame( V1 = c("colors1", "colors2"), V2 = c("black;yellow;green", "blue;pink;purple") )
- 执行拆分行操作,直接得到你期望的长表结构
df_long <- separate_rows(df, V2, sep = ";")
运行后df_long的输出和你给出的期望结构完全一致:
V1 V2 1 colors1 black 2 colors1 yellow 3 colors1 green 4 colors2 blue 5 colors2 pink 6 colors2 purple
- 直接衔接你的
dcast语句生成频率矩阵,注意加上聚合函数避免报错:
freq_matrix <- dcast(df_long, V2 ~ V1, fun.aggregate = length, value.var = "V1")
方案2:Base R 无依赖写法
如果不想安装第三方包,可以用基础R的字符串拆分函数手动拼接长表:
# 按分号拆分V2列的每个值 split_v2 <- strsplit(df$V2, ";") # 按拆分后的长度重复V1列,和拆分后的V2值组合成新数据框 df_long_base <- data.frame( V1 = rep(df$V1, times = lengths(split_v2)), V2 = unlist(split_v2) )
得到的df_long_base和上面方案1的结果完全一致,同样可以直接传入dcast使用。
注意:调用
dcast时必须指定fun.aggregate参数,否则会因为V2列存在多个同V1的匹配值抛出聚合错误,用length做计数即可得到0/1编码的频率矩阵。
内容的提问来源于stack exchange,提问作者Munrock
相关产品推荐
相关产品推荐

