К сожалению, ваши два фрейма данных не очень полезны, но я думаю, что можно работать в обратном направлении со второго фрейма данных, чтобы получить более репрезентативные данные.На основании вашего комментария первый фрейм данных может содержать один и тот же species
с разными BIN
с.Если это так, то мы можем просто разделить второй кадр данных, чтобы получить df1
:
# A tibble: 9 x 3
species BIN grade
<chr> <chr> <int>
1 Abalistes filamentosus BOLD:AAD4738 NA
2 Abalistes stellaris BOLD:AAD4739 NA
3 Abalistes stellatus BOLD:AAD4739 NA
4 Ablabys binotatus BOLD:AAF8834 NA
5 Ablennes hians BOLD:AAC1231 NA
6 Abramis brama BOLD:AAC8592 NA
7 Abalistes stellaris BOLD:ACK7828 NA
8 Abalistes stellatus BOLD:ACK7828 NA
9 Ablennes hians BOLD:AAB9824 NA
Второй кадр данных df2
остается тем же.
Использование одного кадра данных
Если я правильно понял проблему, вам действительно даже не нужен второй кадр данных.Вместо этого вы можете сделать что-то вроде этого, который группирует по species
и дает каждой группе оценку в зависимости от ее размера n()
:
df1 %>%
group_by(species) %>%
mutate(grade = ifelse(n() == 1, "A", "C"))
#### OUTPUT ####
# A tibble: 9 x 3
# Groups: species [6]
species BIN grade
<chr> <chr> <chr>
1 Abalistes filamentosus BOLD:AAD4738 A
2 Abalistes stellaris BOLD:AAD4739 C
3 Abalistes stellatus BOLD:AAD4739 C
4 Ablabys binotatus BOLD:AAF8834 A
5 Ablennes hians BOLD:AAC1231 C
6 Abramis brama BOLD:AAC8592 A
7 Abalistes stellaris BOLD:ACK7828 C
8 Abalistes stellatus BOLD:ACK7828 C
9 Ablennes hians BOLD:AAB9824 C
Использование двух фреймов данных
Если,по какой-то причине вам нужно использовать df1
и df2
, я думаю, что самый простой подход - это объединить два кадра данных в species
, а затем изменить grade
в соответствии со значениями bin_per_species
:
full_join(df1, df2, by = "species") %>%
mutate(grade = case_when(bin_per_species == 1 ~ "A",
bin_per_species == 2 ~ "B",
bin_per_species > 2 ~ "C",
)) %>%
select(1:3)
#### OUTPUT ####
# A tibble: 9 x 3
species BIN.x grade
<chr> <chr> <chr>
1 Abalistes filamentosus BOLD:AAD4738 A
2 Abalistes stellaris BOLD:AAD4739 B
3 Abalistes stellatus BOLD:AAD4739 B
4 Ablabys binotatus BOLD:AAF8834 A
5 Ablennes hians BOLD:AAC1231 B
6 Abramis brama BOLD:AAC8592 A
7 Abalistes stellaris BOLD:ACK7828 B
8 Abalistes stellatus BOLD:ACK7828 B
9 Ablennes hians BOLD:AAB9824 B
Я включил case_when()
на случай, если у вас больше, чем просто две степени «А» и «С».Вы также можете использовать его в решении "один кадр данных".Если у вас действительно есть только эти две оценки, вы можете упростить вещи с помощью ifelse()
:
full_join(df1, df2, by = "species") %>%
mutate(grade = ifelse(bin_per_species == 1, "A", "C")) %>%
select(1:3)