подстановка столбца на два условия в другом столбце r

#r #dplyr

#r #dplyr

Вопрос:

У меня есть набор данных, в котором некоторые hex_id обнаруживаются как us (восходящий поток), так и ds (нисходящий поток). Есть около 500 рыб, которые были обнаружены как в США, так и в ds. Я пытаюсь подмножить столбец hex_id, чтобы он возвращал только строки, где hex_id == us и hex_id == ds.

 hex_id         loc det#
3D9.1C2D9B1656  us  1
3D9.1C2D9B1C20  us  2
3D9.1C2D9B1C91  us  1
3D9.1C2D9B2110  ds  1
3D9.1C2D9B2226  ds  1
3D9.1C2D9B2CA7  us  19
3D9.1C2D9B3128  us  2
3D9.1C2D9B376C  us  2
3D9.1C2D9B39B1  us  1
3D9.1C2D9B3A1E  us  5
3D9.1C2D9B4717  ds  1
3D9.1C2D9B4717  us  1
3D9.1C2D9B4731  ds  1
3D9.1C2D9B4740  us  25
 

Я пытался это:

 pit_both <- pitdata %>%
  filter(down == "ds" amp; up == "us") %>% 
  summarise(fish = n_distinct(hex_id))
 

И получение этого:

 pit_both
  fish
1    0
 

Я думаю, это потому, что каждое обнаружение имеет свою собственную строку, поэтому нигде в таблице данных отдельная строка не равна ds и us одновременно, это hex_id, который мне нужно равнять up и ds.

Есть предложения??

Ответ №1:

Другой подход заключается в том, чтобы развернуть det столбец (я переименовал det# , чтобы сделать его допустимым именем столбца) loc , чтобы его было легче фильтровать. Все зависит от того, как вы хотите использовать данные.

 library(dplyr)
library(tidyr)

pitdata %>% 
  pivot_wider(names_from = loc, values_from = det) %>% 
  filter(!is.na(us), !is.na(ds))

# # A tibble: 1 x 3
#     hex_id            us    ds
#     <fct>          <int> <int>
#   1 3D9.1C2D9B4717     1     1
 

Ответ №2:

Далее создаются два подмножества ваших данных для «us» и «ds», а затем находят все строки, которые имеют соответствующий шестнадцатеричный идентификатор.

 library(dplyr)

inner_join(
  pitdata %>% filter(loc == "us"),
  pitdata %>% filter(loc == "ds"),
  by = "hex_id")
 

Результат будет примерно таким:

 hex_id            loc.x  det.x loc.y det.y
3D9.1C2D9B4717    us     1     ds    1
 

Если вы хотите вернуть его в исходный формат, вы можете повернуть таблицу.

Ответ №3:

Причина, по которой ваш подход не работает, заключается в том, что ни одна из строк loc не является одновременно "us" И "ds" .

Вот подход с dplyr . Сначала group_by(hex_id) и затем используйте filter , чтобы проверить, что loc содержит оба "us" и "ds" для этой группы.

 pitdata %>%
  group_by(hex_id) %>%
  dplyr::filter(any(loc == "us") amp; any(loc == "ds"))
## A tibble: 2 x 3
## Groups:   hex_id [1]
#  hex_id         loc    det.
#  <chr>          <chr> <int>
#1 3D9.1C2D9B4717 ds        1
#2 3D9.1C2D9B4717 us        1
 

Отсюда легко подсчитать рыбу:

 pitdata %>%
  group_by(hex_id) %>%
  dplyr::filter(any(loc == "us") amp; any(loc == "ds")) %>%
  ungroup %>%
  summarise(fish = n_distinct(hex_id))
# A tibble: 1 x 1
   fish
  <int>
1     1