Как сопоставить и посчитать по именам во фрейме данных для каждого сгруппированного имени? - PullRequest
1 голос
/ 27 июня 2019

У меня есть столбец данных с именами видов плюс V1, V4 или V9 (или только название вида) в столбце, и у меня есть столбец со многими названиями ордеров, которые повторяются вдоль столбца. Что мне нужно, так это то, что помогает мне подсчитать, сколько раз он соответствует V1 первого столбца с каждым заказом, а затем то же самое для V4 и V9.

Я пробовал это для подсчета V1:

countordens <- malardf %>%
  group_by(ordens) %>%
  summarise(V1=(sum(str_count(malardf$malar_names, pattern="V1"))))

Но он возвращает столбец с сгруппированными заказами, но с общей суммой V1 в кадре данных вместо общей суммы V1 для каждого Заказа.

                 malar_names malaordens.Order
1  Protomima imitatrix V1 V9        Amphipoda
2 Caprella danilevskii V1 V9        Amphipoda
3           Caprella andreae        Amphipoda
4           Caprella andreae        Amphipoda
5           Caprella andreae        Amphipoda
6           Caprella andreae        Amphipoda

Я надеюсь получить фрейм данных с каждым заказом из Orders только один раз, а второй столбец с количеством совпадений этого ордера с "V1" на фрейме данных, и другим для "V4", и другим для " V9" .

1 Ответ

2 голосов
/ 28 июня 2019

Если мы хотим получить количество множественных значений, тогда используйте map

library(tidyverse)
map(c("V1", "V4", "V9"), ~ 
                         malardf %>%
                               group_by(malaordens.Order) %>%
                               summarise(!! .x := sum(str_count(malar_names,
                                pattern = .x)))) %>%
   reduce(inner_join, by = "malaordens.Order") 
# A tibble: 1 x 4
#  malaordens.Order    V1    V4    V9
#  <chr>            <int> <int> <int>
#1 Amphipoda            2     0     2

Обратите внимание, что проблема ОП в коде при подсчете одного шаблона также связана с извлечением целого столбца(malardf$) после выполнения group_bymutate/summarise нет необходимости использовать data$, вместо этого просто передайте имя столбца без кавычек.Он будет работать неизменно с группой или без операции

data

malardf <- structure(list(malar_names = c("Protomima imitatrix V1 V9",
 "Caprella danilevskii V1 V9", 
"Caprella andreae", "Caprella andreae", "Caprella andreae", "Caprella andreae"
), malaordens.Order = c("Amphipoda", "Amphipoda", "Amphipoda", 
"Amphipoda", "Amphipoda", "Amphipoda")), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...