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

У меня есть такой фрейм данных с названиями видов морских рыб в одном столбце и их соответствующими БИН в другом столбце (который является своего рода идентификатором для каждого вида). Иногда один номер BIN может соответствовать более чем одному виду, и я хочу проверить, какие виды соответствуют одному BIN, а какие имеют более одного BIN для каждого отдельного вида в каждом ряду. Мне жаль, если я сбиваю с толку, но я очень потерян в том, как я могу это сделать. Заранее благодарю за любое предложение

 1.  species          BIN
 2. Tilapia guineensis BOLD:AAL5979
 3. Tilapia zillii BOLD:AAB9042
 4. Fundulus rubrifrons BOLD:AAI7245
 5. Eutrigla gurnardus BOLD:AAC0262
 6.  Sprattus sprattus BOLD:AAE9187
 7.  Gadus morhua BOLD:ACF1143
 8. Clupea harengus BOLD:AAB7944
 (...)

Ответы [ 2 ]

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

Другим вариантом в tidyverse было бы получить distinct строки, сгруппированные по «видам», summarise «вхождение» как количество строк (n()) и использовать str_c (из * 1006). * - часть пакетов tidyverse - что также дает другое поведение при наличии NA элементов) для collapse элементов в одну строку

library(dplyr)
library(stringr)
df %>% 
    distinct() %>%
    group_by(species) %>%
    summarise(occurrence = n(),
       BIN = str_c(unique(BIN), collapse = ","))
# A tibble: 7 x 3
#  species             occurrence BIN                      
#  <chr>                    <int> <chr>                    
#1 Clupea_harengus              1 BOLD:AAB7944             
#2 Eutrigla_gurnardus           2 BOLD:AAC0262,BOLD:AAE9187
#3 Fundulus_rubrifrons          1 BOLD:AAI7245             
#4 Gadus_morhua                 1 BOLD:ACF1143             
#5 Sprattus_sprattus            1 BOLD:AAE9187             
#6 Tilapia_guineensis           1 BOLD:AAL5979             
#7 Tilapia_zillii               1 BOLD:AAB9042 

Если есть элементы NA, поведение будет немного другим (если мы сначала не позаботимся о NA s)

paste(c(NA, 'a', 'b'), collapse=",")
#[1] "NA,a,b"
str_c(c(NA, 'a', 'b'), collapse=",")
#[1] NA

данные

df <- structure(list(species = c("Tilapia_guineensis", "Tilapia_zillii", 
"Fundulus_rubrifrons", "Eutrigla_gurnardus", "Eutrigla_gurnardus", 
"Sprattus_sprattus", "Gadus_morhua", "Clupea_harengus"), BIN = c("BOLD:AAL5979", 
"BOLD:AAB9042", "BOLD:AAI7245", "BOLD:AAC0262", "BOLD:AAE9187", 
"BOLD:AAE9187", "BOLD:ACF1143", "BOLD:AAB7944")),
class = "data.frame", row.names = c("2", 
"3", "4", "5", "6", "7", "8", "9"))
2 голосов
/ 01 июня 2019

С помощью dplyr вы можете сделать (я использовал выборочные данные для вида, имеющего два BIN):

df %>%
 group_by(species) %>%
 summarise(occurrence = n_distinct(BIN),
           BIN = paste(unique(BIN), collapse = ","))

  species             occurrence BIN                      
  <chr>                    <int> <chr>                    
1 Clupea_harengus              1 BOLD:AAB7944             
2 Eutrigla_gurnardus           2 BOLD:AAC0262,BOLD:AAE9187
3 Fundulus_rubrifrons          1 BOLD:AAI7245             
4 Gadus_morhua                 1 BOLD:ACF1143             
5 Sprattus_sprattus            1 BOLD:AAE9187             
6 Tilapia_guineensis           1 BOLD:AAL5979             
7 Tilapia_zillii               1 BOLD:AAB9042 

Он подсчитывает количество BIN для «вида» и объединяет имя уникальногоБИН, принадлежащие к виду.

Данные выборки:

df <- read.table(text = "species          BIN
 2 Tilapia_guineensis BOLD:AAL5979
 3 Tilapia_zillii BOLD:AAB9042
 4 Fundulus_rubrifrons BOLD:AAI7245
 5 Eutrigla_gurnardus BOLD:AAC0262
 6 Eutrigla_gurnardus BOLD:AAE9187
 7  Sprattus_sprattus BOLD:AAE9187
 8  Gadus_morhua BOLD:ACF1143
 9 Clupea_harengus BOLD:AAB7944", header = TRUE,
                 stringsAsFactors = FALSE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...