У меня есть пример набора данных, garden
, как показано ниже. Реальная вещь - тысячи строк. У меня также есть список примеров. productFruit
. Я хочу знать calories
каждого fruit
, учитывая usage
, указанный в garden
. Я в основном хочу, чтобы l oop прошел по всем строкам в моей таблице, проверил, является ли использование recorded
в списке productFruit
, и возвращает либо calories
, либо одно из следующих сообщений об ошибке:
- "использование вне области", если в списке
productFruit
не найдено usage
- "использование вне области", если в
productFruit
не найдено usage
list - "ошибочные данные", если данные отсутствуют
garden
:
fruit = c("Apple", "Kiwi", "Banana", "Orange", "Blueberry")
usage = c("cooking", "cooking", "NA", "drinking", "medicine")
reported = c(200, 500, 77, 520, 303)
garden <- cbind(fruit, usage, reported)
garden <- as.data.table(garden)
productFruit
:
productFruit <- list(Basket = c('DUH'),
type = list (
Apple = list(ID = 1,
color = "poor",
usage = list(eating = list(ID = 1,
quality = "good",
calories = 500),
medicine = list(ID = 2,
quality = "poor",
calories = 300))),
Orange = list(ID = c(1,2,3),
color = c(3,4,5),
usage = list(eating = list(ID = 1,
quality = "poor",
calories = 420),
cooking = list(ID = 2,
quality = "questionable",
calories = 600),
drinking = list(ID = 3,
quality = "good",
calories = 800),
medicine = list(ID = 4,
quality = "good",
calories = 0))),
Banana = list(ID = c(1,2,3),
color = c(3,4,5),
usage = list(cooking = list(ID = 1,
quality = "good",
calories = 49),
drinking = list(ID = 2,
quality = "questionable",
calories = 11),
medicine = list(ID = 3,
quality = "poor",
calories = 55)))))
Я пытался разбить его на более мелкие шаги и делать это с циклами, но у меня очень мало опыта с lists
и я получал много ошибок. Любые идеи, как решить это эффективным и читабельным способом? Ниже одна из моих многочисленных попыток просто соответствовать fruits
. Я знаю, что поле не совпадает, я просто пытался заставить l oop работать вообще ...
for (i in seq_len(nrow(garden))){
if (garden$fruit[i] == productFruit$type){
garden$calories = productFruit$type[[i]]$ID
}
garden$calories = "error"
}
Требуемый вывод такой:
fruit = c("Apple", "Kiwi", "Banana", "Orange", "Blueberry")
usage = c("cooking", "cooking", "NA", "drinking", "medicine")
reported = c(200, 500, 77, 520, 303)
calories = c("usage out of scope", "fruit out of scope", "erroneous data", 800, "fruit out of scope")
garden_with_calories <- cbind(fruit, usage, reported, calories)
garden_with_calories <- as.data.table(garden)