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

如何用R将数据框中字符格式的列表型变量转为长格式数据框?

解决字符列表变量转长格式数据框的问题

Hey Thomas, let's work through this problem together! Your dataset has character columns formatted like list strings (with curly braces and quotes), and you want to unpack them into a clean long-format dataframe—even with thousands of rows. Here's a straightforward, efficient way to do this using both tidyverse tools (for simplicity) and base R (if you prefer avoiding extra packages).

方法一:使用tidyverse(推荐,代码更简洁)

First, we'll use stringr to clean up those messy characters, convert the strings to lists, then use tidyr to expand the lists into long format.

# Load the tidyverse package (includes stringr for text manipulation and tidyr for reshaping)
library(tidyverse)

# Your original dataset
id <- c("112") 
name <- c("{\"dog\", \"cat\",\"attashee\"}") 
value <- c("{\"21000\", \"23400\", \"26800\"}") 
test_df <- data.frame(id, name, value)

# Step 1: Clean the strings and convert them to lists
test_df_cleaned <- test_df %>%
  mutate(
    # Remove curly braces and double quotes, then split into lists (handles both ", " and "," separators)
    name = str_remove_all(name, "[{}\"]") %>% str_split(",\\s*"),
    value = str_remove_all(value, "[{}\"]") %>% str_split(",\\s*")
  )

# Step 2: Expand the list columns into long format
test_df_long <- test_df_cleaned %>%
  unnest_longer(cols = c(name, value))

# Check the result
print(test_df_long)

代码解释:

  • str_remove_all(name, "[{}\"]"): 去掉字符串里的大括号{}和双引号", 只留下用逗号分隔的内容。
  • str_split(",\\s*"): 将清理后的字符串拆分成元素列表。\\s*匹配逗号后的任意数量空格,所以不管元素之间是", "还是",都能正确拆分(比如你例子里的"cat\",\"attashee")。
  • unnest_longer(cols = c(name, value)): 将列表里的每个元素展开成单独行,同时保持id和对应的name、value配对。

方法二:使用Base R(无需额外包)

如果你不想加载外部包,这里有个base R的替代方案,能达到同样的效果:

# 定义一个清理并拆分字符串的辅助函数
clean_and_split <- function(string) {
  # 去掉大括号和引号
  cleaned <- gsub("[{}\"]", "", string)
  # 拆分成单个元素(兼容逗号后有无空格的情况)
  strsplit(cleaned, ",\\s*")[[1]]
}

# 将函数应用到name和value列
test_df$name <- lapply(test_df$name, clean_and_split)
test_df$value <- lapply(test_df$value, clean_and_split)

# 转换为长格式,将每个id和对应的name/value配对组合
test_df_long <- do.call(rbind, Map(data.frame, id = test_df$id, name = test_df$name, value = test_df$value))

# 查看结果
print(test_df_long)

两种方法都能高效处理数千行数据,因为它们底层使用了向量化操作,不会因为数据量大变慢。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:42:39