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

У меня есть этот первый кадр данных (названный "fish_12") с 74610 строками, в каждом ряду есть данные об образцах морской рыбы. Первый столбец - это название вида, к которому принадлежит каждый образец (во всем фрейме данных много образцов, принадлежащих к одному и тому же виду), второй столбец, BIN, является своего рода идентификационным номером для каждого вида, а затем у меня есть имя сборщика каждого образца, страна, из которой он был получен, и пустой столбец, который я хочу заполнить.

     species        |    BIN      |    collectors  |  country      | grade
--------------------------------------------------------------------------
Tilapia guineensis  |BOLD:AAL5979 |    C.D. Nwani  |     Nigeria   | NA
Tilapia zillii      |BOLD:AAB9042 |    C.D. Nwani  |     Nigeria   | NA
Fundulus rubrifrons |BOLD:AAI7245 |  John Donavan  |  United States| NA
Eutrigla gurnardus  |BOLD:AAC0262 |Hermann Neumann |    North Sea  | NA
Sprattus sprattus   |BOLD:AAE9187 |Hermann Neumann |    North Sea  | NA
Gadus morhua        |BOLD:ACF1143 |Hermann Neumann |    North Sea  | NA
Tilapia zillii      |BOLD:AAB9042 |     C.D. Nwani |      Nigeria  | NA
Gadus morhua        |BOLD:ACF1169 |   Angela Cicia |  United States| NA

Спускаясь по строкам, в основном, у вида может быть только один BIN или более одного, и один и тот же BIN иногда может быть назначен разным видам.

Итак, я пытаюсь заполнить столбец, в котором присваивается оценка «Е» каждому виду, которому присвоен БИН, который сам по себе присвоен более чем 1 разным видам; оценка "D" для каждого вида, который имеет менее 3 вхождений в этом первом кадре данных; «C» - видам, которым назначено более 1 разных BIN, но в то же время каждый из BIN, назначенных этому конкретному виду, назначается только одному виду; «B» для видов, которым присвоен только один ОГРН, но каждый из его образцов собирается от одного сборщика и в одной и той же стране; и, наконец, буква «А» для каждого вида, которому присвоен только один ОГРН, но есть образцы, собранные из более чем одного сборщика или из более чем одной страны.

Итак, я создал новый фрейм данных, включающий столбец с указанием количества BIN для каждого вида (bin_per_species); еще один с колонкой, показывающей, сколько видов присутствует для каждого номера БИН (видов_пер_бина); еще один с колонкой, показывающей, сколько коллекционеров существует для каждого вида (collectors_per_species); и, наконец, один с колонкой о том, сколько стран присвоено каждому виду (country_per_species)

#creating the other dataframe from the first one 

fish_13=fish_12%>% 
  group_by(species) %>%
  summarise(occurrence = n_distinct(BIN),
            BIN = str_c(unique(BIN), collapse = ","))

names(fish_13)=c("species","bin_per_species","BIN")
View(fish_13)

fish_14=fish_12%>% 
  group_by(BIN) %>%
  summarise(occurrence = n_distinct(species),
            species = str_c(unique(species), collapse = ","))

names(fish_14)=c("BIN","species_per_bin","species")
View(fish_14)
length(unique(fish_14$BIN))

fish_15=fish_12%>% 
  group_by(species) %>%
  summarise(occurrence = n_distinct(collectors),
            collectors = str_c(unique(collectors), collapse = ","))
names(fish_15)=c("species","collector_per_species","collectors")
View(fish_15)

fish_16=fish_12%>% 
  group_by(species) %>%
  summarise(occurrence = n_distinct(country),
            country = str_c(unique(country), collapse = ","))
names(fish_16)=c("species","countries_per_species","country")
View(fish_16)

Итак, здесь я попытался сформировать условия с различными функциями if / else, но у меня возникли проблемы, заключающиеся в том, что кадры данных имеют разную длину, и я не могу назначить все оценки от A до E одновременно, потому что даже когда мне удается избежать ошибок, некоторые из них преобразуются обратно в NA. Вывод, который я хотел получить, - это, по сути, первый кадр данных, каждому экземпляру присвоена оценка.

Извините, если я запутываю и неправильно представляю данные, но я новичок в этом сообществе и пытаюсь поправиться. Заранее спасибо за любой ответ

1 Ответ

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

Во-первых, добро пожаловать в SO.

Теперь по поводу вашего вопроса: я немного растерялся, пытаясь понять все правила, но думаю, что решение может быть простым.

У вас естьэти правила в основном основаны на строке BIN, повторяют эти значения и выполняют подмножество данных, затем вы применяете функцию для проверки правил и обновления оценки.

Например:

bins = unique(fish_12$BIN)
for(b in bins) {
    # Get the index so you can update only the grade of the subset
    sub_fish_index = which(fish_12$BIN == b)
    sub_fish_data = fish_12[,sub_fish_index]

    # use a function to identiffy the patterns and apply the rules (return a vector of rules)
    new_grade = apply_rules(sub_fish_data)

    # Update grade in the main data.frame
    fish_12$grade[sub_fish_index] = new_grade
}

Я вернул вектор оценок, потому что некоторые правила могут использовать эту информацию и устанавливать правильную оценку.

Надеюсь, это поможет вам.

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