Выполнение условных (иначе говоря) функций с использованием двух фреймов данных? - PullRequest
0 голосов
/ 01 июня 2018

Я надеюсь, что кто-то может помочь мне с этим испытанием (я довольно плохо знаком с R).У меня есть один фрейм данных (графики), который имеет уникальные записи для видов деревьев (Spp) и размера дерева (Dbh).У меня есть второй фрейм данных (Параметры), который дает параметры (X и Y) для функции для каждого вида.

Plots
Id  Spp Dbh
414 SM  27.2
415 BE  17.4
416 YB  35.8
418 SM  43.5
419 SM  53.3
420 SM  53.3
421 SM  11.9
422 TL  27.5
423 XS  13.2

Parameters
Species X   Y
BE  1   10
SM  2   20
YB  3   30
OTH 4   40

Мне нужно просмотреть каждую запись Plots$Spp и выполнить простую функцию для Plots$Dbh с использованием записей X и Y из Parameters (т.е. X * Dbh^Y) для соответствующих Species.Если у Plots$Spp есть запись, которой нет в Parameters$Species (то есть XS или TL), мне нужно использовать значения X и Y для OTH.

Сначала я попытался использовать merge(), но не смогзаставить его работать с ситуацией XS / OTH.Я также пробовал цикл for с вложенным if / else if / else, но снова я потерпел неудачу.Любая помощь будет оценена!

1 Ответ

0 голосов
/ 01 июня 2018

Возможно такой подход:

library(tidyverse)

Plots %>%
  mutate(Species = ifelse(Spp %in% Parameters$Species, Spp, "OTH")) %>%
  left_join(Parameters)

создать новую переменную "Species" в Plots фрейме данных, сначала проверив, находится ли Plots$Spp в Parameters$Species, если да, оставьте Spp, если нетзамените на "OTH", а затем объедините результирующий фрейм данных с Parameters на "Species" столбец.

#output
   Id Spp  Dbh Species X  Y
1 414  SM 27.2      SM 2 20
2 415  BE 17.4      BE 1 10
3 416  YB 35.8      YB 3 30
4 418  SM 43.5      SM 2 20
5 419  SM 53.3      SM 2 20
6 420  SM 53.3      SM 2 20
7 421  SM 11.9      SM 2 20
8 422  TL 27.5     OTH 4 40
9 423  XS 13.2     OTH 4 40

data:

Plots <- read.table(text = "Id  Spp Dbh
414 SM  27.2
415 BE  17.4
416 YB  35.8
418 SM  43.5
419 SM  53.3
420 SM  53.3
421 SM  11.9
422 TL  27.5
423 XS  13.2", header = T, stringsAsFactors = FALSE)

Parameters <- read.table(text = "Species X   Y
BE  1   10
SM  2   20
YB  3   30
OTH 4   40", header = T, stringsAsFactors = FALSE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...