簡體   English   中英

如何將列表列表作為列保存到 R 中的 data.frame object

[英]How can I save a list of lists as a column into a data.frame object in R

可重現的代碼:

    Meal <- function(name, ingredients, time_to_cook = NA, time_of_day = "Dinner", cuisine = NA) {
m <- list(name = name, ingredients = ingredients, time = time_to_cook, meal = time_of_day, cuisine = cuisine)
  m 
}

burritos <- Meal("Burrito", ingredients = c("Tortilla", "Chicken Breast", "Sour Cream", "Pepper", "Onion", "Chili Paste"), time_to_cook = "Fast", cuisine = "Mexican")
pizza <- Meal("Pizza", ingredients = c("Flour", "Tinned Tomato", "Mozarella", "Garlic"))

rbind(data.frame(pizza), data.frame(burritos))

      name    ingredients time   meal cuisine
1    Pizza          Flour <NA> Dinner    <NA>
2    Pizza  Tinned Tomato <NA> Dinner    <NA>
3    Pizza      Mozarella <NA> Dinner    <NA>
4    Pizza         Garlic <NA> Dinner    <NA>
5  Burrito       Tortilla Fast Dinner Mexican
6  Burrito Chicken Breast Fast Dinner Mexican
7  Burrito     Sour Cream Fast Dinner Mexican
8  Burrito         Pepper Fast Dinner Mexican
9  Burrito          Onion Fast Dinner Mexican
10 Burrito    Chili Paste Fast Dinner Mexican

我更喜歡的行為是,如果成分沒有轉換為長格式,即將成分保留為列表,而不是每種成分一行。 有什么辦法可以讓我得到這種行為?

我不想一路 go 並使用關系數據庫,想知道是否有一種簡單的方法來處理這個問題。

小標題

您可以將它們存儲為非常擅長存儲list列的tibble ,只需修改Meal()即可。

library(tibble)

Meal <- function(name, ingredients, time_to_cook = NA, time_of_day = "Dinner", cuisine = NA) {
  m <- tibble(name = name, ingredients = list(ingredients), time = time_to_cook, meal = time_of_day, cuisine = cuisine)
  m 
}

burritos <- Meal("Burrito", ingredients = c("Tortilla", "Chicken Breast", "Sour Cream", "Pepper", "Onion", "Chili Paste"), time_to_cook = "Fast", cuisine = "Mexican")
pizza <- Meal("Pizza", ingredients = c("Flour", "Tinned Tomato", "Mozarella", "Garlic"))

rbind(pizza, burritos)
#> # A tibble: 2 × 5
#>   name    ingredients time  meal   cuisine
#>   <chr>   <list>      <chr> <chr>  <chr>  
#> 1 Pizza   <chr [4]>   <NA>  Dinner <NA>   
#> 2 Burrito <chr [6]>   Fast  Dinner Mexican

從原始解決方案嵌套

或者,您可以完全保留原始解決方案,稍后通過使用nestingredients轉換回list來轉換為tibble

library(tidyr)

rbind(data.frame(pizza), data.frame(burritos)) %>%
  nest(ingredients = ingredients)
#> # A tibble: 2 × 5
#>   name    time  meal   cuisine ingredients     
#>   <chr>   <chr> <chr>  <chr>   <list>          
#> 1 Pizza   <NA>  Dinner <NA>    <tibble [4 × 1]>
#> 2 Burrito Fast  Dinner Mexican <tibble [6 × 1]>

底座 R

最后,如果您想堅持使用基本 R,您可以像 @Akrun 的評論中一樣使用I(list())

Meal <- function(name, ingredients, time_to_cook = NA, time_of_day = "Dinner", cuisine = NA) {
  m <- data.frame(name = name, ingredients = I(list(ingredients)), time = time_to_cook, meal = time_of_day, cuisine = cuisine)
  m 
}

burritos <- Meal("Burrito", ingredients = c("Tortilla", "Chicken Breast", "Sour Cream", "Pepper", "Onion", "Chili Paste"), time_to_cook = "Fast", cuisine = "Mexican")
pizza <- Meal("Pizza", ingredients = c("Flour", "Tinned Tomato", "Mozarella", "Garlic"))
  
rbind(pizza, burritos)
#>      name  ingredients time   meal cuisine
#> 1   Pizza Flour, T.... <NA> Dinner    <NA>
#> 2 Burrito Tortilla.... Fast Dinner Mexican

這是一種快速而骯臟的方法

Meal <- function(name, ingredients, time_to_cook = NA, time_of_day = "Dinner", cuisine = NA) {
  m <- data.frame(name = name, time = time_to_cook, meal = time_of_day, cuisine = cuisine)
  m$ingredients <- list(ingredients)
  m
}

burritos <- Meal("Burrito", ingredients = c("Tortilla", "Chicken Breast", "Sour Cream", "Pepper", "Onion", "Chili Paste"), time_to_cook = "Fast", cuisine = "Mexican")
pizza <- Meal("Pizza", ingredients = c("Flour", "Tinned Tomato", "Mozarella", "Garlic"))

基於這個答案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM