R语言 如果列不存在,则在嵌套tibble中创建列

14ifxucb  于 2023-05-11  发布在  其他
关注(0)|答案(1)|浏览(118)

我正在尝试从嵌套的tibble中提取数据。在外部字节内,并非所有字节都可以存在或完整。如果列不存在,我希望返回0。

df <- tibble(a = tibble(iris),
             b = tibble(iris[1:2]),
             c = NULL)

现在我想从每个嵌套的tibble中提取列'species',如果没有数据可用,则生成的列将填充NA。因此结果等于:

tibble(a_s = iris$Species, 
       b_s = NA, 
       c_s = NA)

有什么方法可以做到这一点吗?
我天真地试着:

transmute(df, a_s = a$species,
              b_s = b$species,
              c_s = c$species)

这当然只适用于a_s,为b_s生成警告,并为c_s抛出错误。
我尝试创建一个帮助函数来评估每一列的存在,但这对嵌套的 Dataframe 不起作用。有什么解决办法吗?
UPDATE:为了清楚起见,我总是希望按照指定的方式生成输出,而tibble c可能存在,也可能不存在。

ct3nt3jp

ct3nt3jp1#

ifelse中使用grepl检查 Species,并使用do.call获得最终的tibble

library(dplyr)

do.call(tibble, sapply(c("a", "b", "c"), function(x)
  ifelse(any(grepl("Species", names(df[[x]]))), 
         df[[x]]["Species"], 
         NA_character_))) %>% 
  rename_with(~ paste0(.x, "_s"))
# A tibble: 150 × 3
   a_s    b_s   c_s  
   <fct>  <chr> <chr>
 1 setosa NA    NA   
 2 setosa NA    NA   
 3 setosa NA    NA   
 4 setosa NA    NA   
 5 setosa NA    NA   
 6 setosa NA    NA   
 7 setosa NA    NA   
 8 setosa NA    NA   
 9 setosa NA    NA   
10 setosa NA    NA   
# … with 140 more rows
# ℹ Use `print(n = ...)` to see more rows

相关问题