如何在含嵌套命名列表的tibble中新增名称存在判断列?
在Tibble中新增列判断嵌套命名列表是否存在指定名称
刚好遇到过类似的需求,给你一个简洁灵活的解决方案,完全匹配你的要求——不用展开嵌套列表,仅通过两个输入(待搜索字符串、目标嵌套列名)就能生成判断列,NULL值时返回NA:
步骤1:加载必要的包
我们需要用到tibble(处理数据框)、dplyr(数据操作)和purrr(处理列表):
library(tibble) library(dplyr) library(purrr)
步骤2:定义通用处理函数
这个函数可以灵活接收你提到的两个输入,动态生成符合命名规范的判断列:
add_has_name_column <- function(df, search_name, nested_col) { # 动态生成新列名,格式为has_taken_小写搜索名 new_col_name <- paste0("has_taken_", tolower(search_name)) df %>% mutate( !!new_col_name := map_lgl( .data[[nested_col]], ~ if (is.null(.x)) { # 嵌套元素为NULL时返回NA NA } else { # 检查搜索名称是否在嵌套列表的命名中 search_name %in% names(.x) } ) ) }
步骤3:应用到你的示例数据
先确认你的示例数据结构:
df_correct <- structure( list( var_name = c("age", "classes"), title = c("What is your age?", "what classes have you taken?"), class_descriptions = list( NULL, list( History = "History of Art", Chemistry = "Organic Chemistry", other = "Other Classes" ) ) ), row.names = c(NA,-2L), class = c("tbl_df", "tbl", "data.frame") )
调用函数,传入搜索字符串"History"和嵌套列名"class_descriptions":
result_df <- add_has_name_column(df_correct, "History", "class_descriptions")
查看结果
运行后得到的结果如下:
# A tibble: 2 × 4 var_name title class_descriptions has_taken_history <chr> <chr> <list> <lgl> 1 age What is your age? <NULL> NA 2 classes what classes have you taken? <named list [3]> TRUE
灵活扩展
如果需要判断其他名称(比如"Chemistry"),只需要修改搜索字符串参数即可:
result_df_chem <- add_has_name_column(df_correct, "Chemistry", "class_descriptions")
这样就完全满足你的需求了——既不用展开嵌套列表,又能灵活处理不同的搜索目标,NULL值也会正确返回NA。
内容的提问来源于stack exchange,提问作者Emman
相关产品推荐
相关产品推荐

