Как я могу изменить значения определенных строк в столбце на основе условия из другого столбца в кадре данных, используя функцию ifelse? - PullRequest
0 голосов
/ 19 июня 2019

Итак, у меня есть этот первый фрейм данных (fish18), который состоит из данных об образцах рыбы и столбца «сорт», который должен быть заполнен условиями в функции ifelse.

species          BIN                                  collectors                          country grade species_frequency
1   Poecilothrissa congica BOLD:AAF7519                                 mljs et al, Democratic Republic of the Congo    NA                 2
2    Acanthurus triostegus BOLD:AAA9362 Vinothkumar S, Kaleshkumar K and Rajaram R.                            India    NA                54
3 Pseudogramma polyacantha BOLD:AAC5137                            Allan D. Connell                     South Africa    NA                15
4   Pomadasys commersonnii BOLD:AAD1338                            Allan D. Connell                     South Africa    NA                12
5       Secutor insidiator BOLD:AAB2487                            Allan D. Connell                     South Africa    NA                18
6      Sebastes macdonaldi BOLD:AAJ7419                                Merit McCrea                    United States    NA                 3
  BIN_per_species collector_per_species countries_per_species species_per_bin
1               2                     1                     1               1
2               1                    21                    15               1
3               3                     6                     6               1
4               1                     2                     1               1
5               4                     5                     4               2
6               1                     1                     1               1

И после заполнения колонки оценок у меня что-то вроде этого (fish19)

           species          BIN                                  collectors                          country grade species_frequency
1   Poecilothrissa congica BOLD:AAF7519                                 mljs et al, Democratic Republic of the Congo     D                 2
2    Acanthurus triostegus BOLD:AAA9362 Vinothkumar S, Kaleshkumar K and Rajaram R.                            India     A                54
3 Pseudogramma polyacantha BOLD:AAC5137                            Allan D. Connell                     South Africa     C                15
4   Pomadasys commersonnii BOLD:AAD1338                            Allan D. Connell                     South Africa     A                12
5       Secutor insidiator BOLD:AAB2487                            Allan D. Connell                     South Africa     E                18
6      Sebastes macdonaldi BOLD:AAJ7419                                Merit McCrea                    United States     B                 3
  BIN_per_species collector_per_species countries_per_species species_per_bin
1               2                     1                     1               1
2               1                    21                    15               1
3               3                     6                     6               1
4               1                     2                     1               1
5               4                     5                     4               2
6               1                     1                     1               1

Оба кадра данных имеют много экземпляров, принадлежащих к одному и тому же виду рыб, и дело в том, что сорта назначаются для каждого вида для каждого экземпляра этого вида. Проблема, с которой я столкнулся, заключается в том, что некоторые ряды, принадлежащие к одному и тому же виду, имеют разные оценки, особенно в случае сортов «С» и «Е». То, что я хочу включить в свою функцию ifelse: переходить с уровня «C» на «E» при каждом появлении кадра данных, когда двум или более образцам, принадлежащим к одному и тому же виду, присваивается «C» в одном ряду и «E» в другом. строка. Потому что, если у одного вида есть сорт "E", у каждого другого ряда с этим названием вида также должен быть сорт "E".

До сих пор я пробовал функцию% in% и просто использовал "=="

Попытка с% в%

assign_grades=function(fish18){
  fish19<-fish18 %>%
    mutate(grade = ifelse(species_frequency<3,"D",ifelse(BIN_per_species==1 & (collector_per_species>1 | countries_per_species>1),"A",ifelse(BIN_per_species==1 & collector_per_species==1 | countries_per_species==1,"B",ifelse(BIN_per_species>1 & species_per_bin==1,"C",ifelse(species_per_bin>1,"E",ifelse(fish19$species[fish19$grade=="E"]%in%fish19$species[fish19$grade=="C"]==TRUE,"E",NA))) ))))
  assign('fish19',fish19,envir=.GlobalEnv)
}
assign_grades(fish18)

Попытка с "=="

assign_grades=function(fish18){
  fish19<-fish18 %>%
    mutate(grade = ifelse(species_frequency<3,"D",ifelse(BIN_per_species==1 & (collector_per_species>1 | countries_per_species>1),"A",ifelse(BIN_per_species==1 & collector_per_species==1 | countries_per_species==1,"B",ifelse(BIN_per_species>1 & species_per_bin==1,"C",ifelse(species_per_bin>1,"E",ifelse(fish19$species[fish19$grade=="E"]==fish19$species[fish19$grade=="C"],"E",NA))) ))))
  assign('fish19',fish19,envir=.GlobalEnv)
}
assign_grades(fish18)

Оба эти двух варианта не сработали, и результатом этого изменения должно быть то, что если одному вхождению названия конкретного вида присвоен класс «Е», то же самое должно произойти и во всех других случаях с таким же названием вида. Извините, если это было замешательство, но я старался быть максимально ясным, заранее благодарю за любые ответы.

1 Ответ

0 голосов
/ 20 июня 2019

Отчасти длинный ответ, но:

dat = data.frame('species'=c('a','b','c','a','a','b'),'grade'=c('E','E','C','C','C','D'))
dat %>% left_join(dat %>% 
                    group_by(species) %>% 
                    summarize(sum_e = sum(grade=='E')),by='species')

Тогда вы могли бы сделать ifelse для sum_e> 0

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