R语言中如何将嵌套列表转换为指定结构的DataFrame?
解决嵌套列表转指定结构数据框的问题
问题原因
直接用as.data.frame(tweetsdata)得到1行4列的结果,是因为R处理这种嵌套列表时,会把外层列表的每个子列表当作数据框的列组,把每个子列表里的元素拆成单独的列(比如politician1.meanlikes),而不是把每个子列表当作数据框的一行,这和你期望的结构逻辑不符。
基础R解决方案
方法1:手动提取元素构建数据框
你手动创建数据框时,只需用sapply提取每个子列表里的对应值即可:
tweetsdata <- list(politician1=list(meanlikes=2, meanretweet=1), politician2=list(meanlikes=4, meanretweet=3)) tweetsdata_df <- data.frame( POLITICIAN = tools::toTitleCase(names(tweetsdata)), # 转成首字母大写格式 MEANLIKES = sapply(tweetsdata, function(x) x$meanlikes), MEANRETWEETS = sapply(tweetsdata, function(x) x$meanretweet), stringsAsFactors = FALSE )
方法2:先合并子列表为行再处理
用do.call(rbind, ...)把每个子列表转成数据框的行,再补充政客名字列:
temp_df <- do.call(rbind, tweetsdata) tweetsdata_df <- data.frame( POLITICIAN = tools::toTitleCase(rownames(temp_df)), MEANLIKES = temp_df$meanlikes, MEANRETWEETS = temp_df$meanretweet, row.names = NULL # 移除默认行名 )
tidyverse工具解决方案(更简洁)
如果习惯用tidyverse系列包,可以用purrr::map_dfr直接按行绑定子列表,同时自动提取外层列表的名字作为列:
library(purrr) tweetsdata_df <- map_dfr(tweetsdata, ~as.data.frame(.x), .id = "POLITICIAN") %>% mutate(POLITICIAN = tools::toTitleCase(POLITICIAN)) %>% rename(MEANRETWEETS = meanretweet, MEANLIKES = meanlikes)
内容的提问来源于stack exchange,提问作者IL DOGE
相关产品推荐
相关产品推荐

