我有这样的数据:
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
(,并且具有特定值banana
、apple
和kiwi
。我也知道这是我的";主变量";因为它具有用于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