![](/img/trans.png)
[英]R - save as data.frame all elements of a list of lists efficiently
[英]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
或者,您可以完全保留原始解決方案,稍后通過使用nest
將ingredients
轉換回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,您可以像 @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.