#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