заполнить более длинную переменную в соответствии с более короткими условиями df - PullRequest
0 голосов
/ 07 мая 2020

У меня есть два фрейма данных: один с правильными ответами, а другой более длинный (больше строк) со всеми ответами опроса. Я хотел бы заменить правильные ответы в одном столбце фрейма данных опроса. Проблема в том, что они имеют разную длину.

Вот пример кода, конечно, функция не работает:

##correct answers df    
species_common <- c("algarrobo", "sapote", "palo santo", "tara", "faique", "caoba", "teca", "neem",
                    "tamarindo", "hualtaco", "guayacan", "eucalyptus", "abarco", "cedro", "caoba", "choiba", 
                    "fresno", "balsa", "acacia", "teca", "melina", "saman", "piñon de oreja", "abarco", 
                    "ceibo", "ebano", "balsa", "ceiba tolúa", "eucalyptus", "teca")
spec_country <- c(rep("Peru",12), rep("Colombia",18))
ecoregion <- c(rep("Dry", 12), rep("Wet", 10), rep("Dry", 8))
species <- as.data.frame(cbind(species_common, spec_country, ecoregion))

##survey df
species_common_2 <- rep(c("algarrobo", "sapote", "palo santo", "tara", "faique", "caoba", "teca", "neem",
                        "tamarindo", "hualtaco", "guayacan", "eucalyptus", "abarco", "cedro", "caoba", "choiba", 
                        "fresno", "balsa", "acacia", "teca", "melina", "saman", "piñon de oreja", "abarco", 
                        "ceibo", "ebano", "balsa", "ceiba tolúa", "eucalyptus", "teca"), 4)
spec_country_2 <- rep(c(rep("Peru",12), rep("Colombia",18), rep(NA, 90)))
ecoregion_2 <- rep(c(rep("Dry", 12), rep("Wet", 10), rep("Dry", 8)),4)
survey <- as.data.frame(cbind(species_common_2, spec_country_2, ecoregion_2))
rows <- sample(nrow(survey))
survey <- survey[rows,]

## ideal function to match cases in order to fill the country column
survey$spec_country_2 <- ifelse(survey$species_common_2==species$species_common & 
                                        survey$ecoregion_2==species$ecoregion,
                                 species$spec_country, survey$spec_country)

Спасибо !!

1 Ответ

0 голосов
/ 07 мая 2020

Общий подход к выполнению этих типов анализа заключается в использовании объединений . В вашем случае желаемый результат может быть достигнут с помощью leftjoin, а затем ifelse. Ваш набор данных species не уникален в species_common и ecoregion level, что вам необходимо учитывать в первую очередь. Пример: какая spec_country для данного предпочтения для комбинации teca и Dry?

species %>% filter(species_common=="teca")
  species_common spec_country ecoregion
1           teca         Peru       Dry
2           teca     Colombia       Wet
3           teca     Colombia       Dry

logi c для достижения желаемого результата:

survey<-survey %>% unique() # remove duplicated rows if any

masterDt<- survey %>% left_join(species,by=c("species_common_2"="species_common","ecoregion_2"="ecoregion"))

masterDt$spec_country_2_Updated<- ifelse(!is.na(masterDt$spec_country_2),masterDt$spec_country)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...