R语言:将嵌套列表转换为tibble数据表
转换嵌套列表为指定结构的tibble
这里有两种实用方法来实现你想要的转换,不管你偏好tidyverse工具链还是base R都能搞定:
方法1:使用tidyverse(purrr + tibble)
这种方法逻辑直观,适合习惯tidy风格的用户:
首先加载所需包:
library(tibble) library(purrr)
然后处理你的嵌套列表:
# 你的原始嵌套列表 ex <- list(list(c("This", "is", "an", "example", "."), c("I", "really", "hate", "examples", ".")), list(c("How", "do", "you", "feel", "about", "examples", "?"))) # 转换为目标tibble result <- imap_dfr(ex, function(sub_list, d_id) { # 将子列表中的所有字符向量合并为一个长向量 all_words <- unlist(sub_list) # 创建包含d_id和对应单词的tibble tibble(d_id = as.integer(d_id), word = all_words) }) # 查看结果 result
代码解释:
imap_dfr会遍历外层列表的每个元素,同时传递元素本身(sub_list)和它的索引(d_id,也就是你需要的文档ID)unlist(sub_list)把每个子列表里的多个字符向量扁平化,变成单个向量- 最后把d_id重复对应次数,和单词组合成符合要求的tibble
方法2:使用base R
如果你不想加载额外的包,用base R也能轻松实现:
# 你的原始嵌套列表 ex <- list(list(c("This", "is", "an", "example", "."), c("I", "really", "hate", "examples", ".")), list(c("How", "do", "you", "feel", "about", "examples", "?"))) # 生成d_id列:根据每个外层元素的总单词数重复对应的ID d_id <- rep(seq_along(ex), sapply(ex, function(x) sum(lengths(x)))) # 展开所有单词 words <- unlist(ex) # 创建tibble result_base <- tibble(d_id = as.integer(d_id), word = words) # 查看结果 result_base
代码解释:
seq_along(ex)获取外层列表的索引(1和2)sapply(ex, function(x) sum(lengths(x)))计算每个外层元素里所有字符向量的总长度(第一个元素是5+5=10,第二个是7)rep(...)把ID重复对应次数,确保每个单词都有正确的d_idunlist(ex)直接把整个嵌套列表扁平化,得到所有单词的向量
两种方法得到的结果完全一致,都会生成你需要的结构:每行对应一个单词,d_id列标记该单词所属的外层列表索引。
内容的提问来源于stack exchange,提问作者Christopher Costello
相关产品推荐
相关产品推荐

