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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 11:52:32