在R语言中重塑数据框字符串,关联服务与对应评分
问题场景
现有如下结构的DataFrame:
df <- data.frame( service = c("1,2,3,4", "2,4,5", "1,3,4"), score = c("1,2,1,3", "1,1,3", "1,1,1") )
其中service是逗号分隔的1-5分类变量,score是对应每个服务的1-3分类变量,每行的变量长度随受访者接受的服务数量不同而变化。需要将其重塑为服务与评分一一对应的长格式,最终目标输出如下:
# ind serv score # <dbl> <dbl> <dbl> # 1 1 1 1 # 2 1 2 2 # 3 1 3 1 # 4 1 4 3 # 5 2 2 1 # 6 2 4 1 # 7 2 5 3 # 8 3 1 1 # 9 3 3 1 #10 3 4 1
解决方案
不需要先将service转换为宽格式,直接同步拆分并展开service和score列即可,这样能保证两者的对应关系不会错位。
方法1:Tidyverse工具链(推荐)
利用tidyr::separate_rows()可以一步完成拆分、展开与类型转换:
library(tidyverse) # 先添加受访者索引列 df <- df %>% mutate(ind = row_number()) # 同步拆分service和score,自动展开为多行并转换为数值型 result <- df %>% separate_rows(service, score, sep = ",", convert = TRUE) %>% rename(serv = service) # 可选:按目标格式重命名列名 print(result)
separate_rows()会按指定分隔符拆分列,同时将每行拆分为对应数量的行,保证service和score的元素一一对应convert = TRUE参数自动将拆分后的字符值转换为数值型,省去后续类型转换步骤
方法2:Base R实现
若不想加载额外包,可使用Base R完成:
# 添加受访者索引 df$ind <- 1:nrow(df) # 将service和score拆分为列表 serv_list <- strsplit(df$service, ",") score_list <- strsplit(df$score, ",") # 构建结果数据框 result <- data.frame( ind = rep(df$ind, sapply(serv_list, length)), serv = as.numeric(unlist(serv_list)), score = as.numeric(unlist(score_list)) ) print(result)
通过rep()重复索引,unlist()展开列表,确保每个服务、评分与原始受访者索引正确绑定。
内容的提问来源于stack exchange,提问作者David Granada Donato
相关产品推荐
相关产品推荐

