如何提取DataFrame元素所属的列表名称作为新列?
解决方法:匹配DataFrame元素所属的列表名称
首先,你创建category列表的方式有问题——用<-在list()里赋值只会创建全局变量(比如fruits、vegetables这些),但列表本身的元素没有设置名称,这是后续无法匹配的核心原因之一。我们先修正列表的创建方式,给每个列表元素赋予明确的名称:
library(tidyverse) # 正确创建带名称的嵌套列表 category <- list( fruits = c("apples","orange", "pear","banana","strawberries"), vegetables = c("cauliflower","potato","onion","tomato"), dairy = c("goats milk", "cows milk") ) # 你的原始DataFrame column1 <- c("apples","potato","onion","goats milk") df <- as.data.frame(column1)
接下来提供两种可行的解决方案:
方法1:将列表转为长格式DataFrame后左连接
这种方法直观易懂,适合处理较大的数据集:
# 把嵌套列表转换成「元素-类别」的长格式 category_df <- category %>% enframe(name = "listname", value = "item") %>% unnest(cols = item) # 和原始DataFrame左连接,匹配每个元素的类别 final <- df %>% left_join(category_df, by = c("column1" = "item")) print(final) #> column1 listname #> 1 apples fruits #> 2 potato vegetables #> 3 onion vegetables #> 4 goats milk dairy
方法2:用purrr::map_chr逐个匹配元素
如果不想创建中间DataFrame,可以用map_chr遍历每个元素,找到它所属的类别名称:
final <- df %>% mutate(listname = map_chr(column1, function(x) { # 找到包含当前元素的列表名称 names(category)[map_lgl(category, ~ x %in% .x)] })) print(final) #> column1 listname #> 1 apples fruits #> 2 potato vegetables #> 3 onion vegetables #> 4 goats milk dairy
为什么你的原代码不生效?
你用column1 %in% category的时候,category是一个列表,%in%只能用来比较向量和向量,无法直接识别列表里的元素,所以返回的是TRUE/FALSE的逻辑值,而不是你想要的类别名称——这就是你没得到预期结果的原因。
内容的提问来源于stack exchange,提问作者Beginner
相关产品推荐
相关产品推荐

