r-将嵌套数据包装到数据帧:不同类型的嵌套数据-逻辑列表和命名列表



我有这样的数据:

my_list <-
list(
my_main_var_isFoodVar = TRUE,
my_main_var_VarNameChosenValues = list(key = "fruit", values = c("banana", "apple", "kiwi"))
)
## $my_main_var_isFoodVar
## [1] TRUE
## $my_main_var_VarNameChosenValues
## $my_main_var_VarNameChosenValues$key
## [1] "fruit"
## $my_main_var_VarNameChosenValues$values
## [1] "banana" "apple"  "kiwi"  

我试图将这些数据组织在一个数据帧中,这样它就会描述一个名为fruit的变量,它是一个";食物变量";(因此isFoodVar = TRUE(,并且具有特定值bananaapplekiwi。我也知道这是我的";主变量";因为它具有用于CCD_ 7的CCD_。

因此所需的输出应该看起来像:

library(tibble)
tribble(~var_name, ~is_main_var, ~is_food_var, ~var_values,
"fruit", TRUE, TRUE, c("banana", "apple", "kiwi"))
##   var_name is_main_var is_food_var var_values
##   <chr>    <lgl>       <lgl>       <list>    
## 1 fruit    TRUE        TRUE        <chr [3]> 
## and we can see the `var_values` if we unnest_longer(var_values):
##  var_name is_main_var is_food_var var_values
##   <chr>    <lgl>       <lgl>       <chr>     
## 1 fruit    TRUE        TRUE        banana    
## 2 fruit    TRUE        TRUE        apple     
## 3 fruit    TRUE        TRUE        kiwi  

我的尝试不足

我知道如何处理的唯一部分是提取CCD_;主变量";。(多亏了这个解决方案(

library(dplyr)
my_list$my_main_var_VarNameChosenValues[1] %>%
{as.data.frame.matrix(table(stack(.)) > 0)} %>%
as_tibble(rownames = "var_name") %>%
rename(is_main_var = key)
##   var_name is_main_var
##   <chr>    <lgl>      
## 1 fruit    TRUE  

即使这样也不够好,因为它甚至没有寻找字符串my_main_var。所以说真的,我不知道如何像演示的那样很好地组织一切。我将感谢任何帮助。


编辑


根据@Tjebo的评论,我正在更新我的数据,并提供更多的上下文和复杂性,以及我自己解决问题的笨拙(和不想要的(方法。

my_list_2 <-
list(
my_main_var_isFoodVar = TRUE,
my_main_var_VarNameChosenValues = list(key = "fruit", values = c("banana", "apple", "kiwi")),
other_var_var_isFoodVar = TRUE,
other_var_varNameChosenValues = list(key = "vegetable", values = c("tomato", "cauliflower", "cabbage"))
)

现在我转换为data.frame,只从my_main_var列中提取信息。


my_list_as_df <- as.data.frame(my_list_2)
pulled_var_name <- 
my_list_as_df %>%
select(starts_with("my_main_var")) %>%
select(ends_with("key")) %>%
unique() %>%
pull()
pulled_var_values <- 
my_list_as_df %>%
select(starts_with("my_main_var")) %>%
select(ends_with("values")) %>%
pull()
pulled_is_food_var <- 
my_list_as_df %>%
select(starts_with("my_main_var")) %>%
select(ends_with("isFoodVar")) %>%
unique() %>%
pull()

tibble(var_name = pulled_var_name,
var_values = list(pulled_var_values),
is_food_var = pulled_is_food_var,
is_main_var = TRUE)
##   var_name var_values is_food_var is_main_var
##   <chr>    <list>     <lgl>       <lgl>      
## 1 fruit    <chr [3]>  TRUE        TRUE  

尽管这完成了任务,但这是一段糟糕的代码。它是重复和笨拙的。但它显示了我所希望的输出:感兴趣的主要变量的汇总表。

类似tidyr::nest的东西应该有帮助:

library(tidyr)
library(dplyr)
my_list_2 <-
list(
my_main_var_isFoodVar = TRUE,
my_main_var_VarNameChosenValues = list(key = "fruit", values = c("banana", "apple", "kiwi")),
other_var_var_isFoodVar = TRUE,
other_var_varNameChosenValues = list(key = "vegetable", values = c("tomato", "cauliflower", "cabbage"))
)
data.frame(my_list_2) %>%
select(starts_with("my_main_var")) %>%
nest(value = contains(".values")) %>% # this is your desired output
mutate(value = paste(unlist(value), collapse = "," )) # if you want character vector rather than list 
#> # A tibble: 1 x 3
#>   my_main_var_isFoodVar my_main_var_VarNameChosenValues.key value            
#>   <lgl>                 <chr>                               <chr>            
#> 1 TRUE                  fruit                               banana,apple,kiwi

最新更新