如何将DataFrame单列转置为多行并保留uId?
解决方法:用tidyverse拆分并展开列表列
这问题我太熟啦!咱们可以用R的tidyverse工具链轻松搞定,既安全又直观,给你两种方案选:
方案一:纯字符串处理(更安全,避免代码解析风险)
如果不确定favs列的字符串是否是完全安全的R代码,推荐用这种纯字符串操作的方法来拆分内容:
首先先构造你的示例数据:
library(tidyverse) # 模拟你的原始DataFrame df <- tibble( uId = c(1000, 1001, 1002, 1003), favs = c("c('pizza')", "c('seafood','steaks')", NA, "c('sushi','strawberries')") )
然后执行处理步骤:
df_processed <- df %>% mutate( # 单独处理NA值,转成包含NA的列表 favs = case_when( is.na(favs) ~ list(NA_character_), TRUE ~ str_remove_all(favs, "^c\\('|'\\)$") %>% # 去掉首尾的c('和') str_split("','") %>% # 按','分割成多个元素 map(str_trim) # 清理每个元素的多余空格 ) ) %>% unnest(favs) # 把列表列展开成多行
方案二:解析R代码(更简洁,适合确定内容安全的场景)
如果能确定favs列的c(...)字符串都是合法且安全的R代码,直接用代码解析的方法会更简洁:
df_processed <- df %>% mutate( favs = case_when( is.na(favs) ~ list(NA_character_), TRUE ~ map(favs, ~ eval(parse(text = .x))) # 把字符串解析成R向量 ) ) %>% unnest(favs)
最终输出结果
两种方法运行后,都会得到你想要的格式:
| uId | favs |
|---|---|
| 1000 | pizza |
| 1001 | seafood |
| 1001 | steaks |
| 1002 | NA |
| 1003 | sushi |
| 1003 | strawberries |
如果你的原始数据量很大,tidyverse的方法效率也足够应付,放心用就好!
内容的提问来源于stack exchange,提问作者ScottP
相关产品推荐
相关产品推荐

