R для результатов l oop - PullRequest
       1

R для результатов l oop

0 голосов
/ 10 января 2020

Мне нужно сохранить результаты моего l oop во фрейме данных, но я не могу понять это. Я получил l oop, работающий, как показано ниже.

Pasta_pesto <- list(ingredienten = c("spaghetti","basilicum","pijnboompitten","pesto"))
Broccoli_spinaziesoep <- list(ingredienten = c("broccoli", "spinazie"))
Romige_kipcurry <- list(ingredienten = c("zilvervliesrijst", "sperziebonen", "kip", "curry"))

recepten <- list(Pasta_pesto, Broccoli_spinaziesoep, Romige_kipcurry)

food_box <- list("spaghetti", "pesto", "kip", "curry")

for (i in recepten) {
   for (e in i) {
      for (j in e) {
          for (k in food_box) {
            if (k == j){
            print(c("true", j, k))
          }
            else {
            print(c("false", j, k))}}}}}

права теперь распечатывает значение true или false, но конечным результатом должна быть таблица со следующими столбцами: recepten, количество true для каждого рецепта, общее количество элементов в списке рецептов. как вы видите, количество истинных должно быть подсчитано и сохранено.

Я надеюсь, что любой из вас сможет мне помочь.

Ответы [ 3 ]

2 голосов
/ 10 января 2020

Произошла ошибка, когда не было найдено ни слова, исправлено

library(tidyverse)

Pasta_pesto <- list(Pasta_pesto = c("spaghetti","basilicum","pijnboompitten","pesto"))
Broccoli_spinaziesoep <- list(Broccoli_spinaziesoep = c("broccoli", "spinazie"))
Romige_kipcurry <- list(Romige_kipcurry = c("zilvervliesrijst", "sperziebonen", "kip", "curry"))

recepten <- list(Pasta_pesto, Broccoli_spinaziesoep, Romige_kipcurry)

food_box<- list("spaghetti", "pesto", "kip", "curry", "basilicum", "pijnboompitten")

operation <- function(x,y){
  count_ingredients <- length(x)
  ingredient_in_food_box  <- x %in% y
  count_of_true <-  ingredient_in_food_box %>% sum
  missing_ingredients <- x[!ingredient_in_food_box] %>% str_flatten(collapse = "_") %>% list
  list(count_ingredients = count_ingredients,
       count_of_true = count_of_true,
       which_ingredient =  missing_ingredients)

}

recepten %>%
  flatten() %>% 
  map_dfr(~ operation(.,food_box),.id = "receipen") %>% 
  mutate(show = which_ingredient %>% as.character())
#> # A tibble: 3 x 5
#>   receipen       count_ingredien… count_of_true which_ingredient show           
#>   <chr>                     <int>         <int> <list>           <chr>          
#> 1 Pasta_pesto                   4             4 <chr [0]>        character(0)   
#> 2 Broccoli_spin…                2             0 <chr [1]>        broccoli_spina…
#> 3 Romige_kipcur…                4             2 <chr [1]>        zilvervliesrij…

Создано в 2020-01-15 с помощью пакета prex (v0.3.0)

1 голос
/ 10 января 2020

Вот базовое решение R

lst <- unlist(recepten,recursive = F)
dfout <- data.frame(
  recp = c("Pasta_pesto", "Broccoli_spinaziesoep", "Romige_kipcurry"),
  ing_num = lengths(lst),
  cnt_true = sapply(lst,function(x) sum(x %in% food_box)))

такое, что

> dfout
                   recp ing_num cnt_true
1           Pasta_pesto       4        2
2 Broccoli_spinaziesoep       2        0
3       Romige_kipcurry       4        2
1 голос
/ 10 января 2020

Самый простой способ сделать это - использовать rbind(). Это также очень медленно, и циклы в R не рекомендуются для такого типа вещей (лучше объединить или объединить). Однако для домашней работы это имеет смысл, потому что вам нужно понять, как работает logi c, прежде чем вы начнете использовать инструменты, чтобы сделать это быстрее.

Как создать пустой фрейм данных:

df1 <- data.frame(contains = character(),
                  recepten = character(),
                  foodbox = character()
       )

Создание пустого фрейма данных облегчает его использование в al oop, поскольку вам не нужно обрабатывать первый l oop (когда данных или фрейма данных нет) иначе, чем более поздние циклы.

Тогда в любое время, когда вы хотите добавить строку в фрейм данных, вы можете создать новый фрейм данных с одной строкой данных, а затем:

df1 <- rbind(df1,df2)

Это медленно, но показывает логи c. Я собираюсь оставить вам, как / где поместить это в l oop, так как это домашняя работа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...