通过另一列r中的两个条件对一列进行子集划分

通过另一列r中的两个条件对一列进行子集划分,r,dplyr,R,Dplyr,我有一个数据集,其中一些十六进制id同时被检测到us(上游)和ds(下游)。在美国和ds两个地点都发现了大约500条鱼。我试图对列hex\u id进行子集划分,以便它只返回hex\u id==us和hex\u 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 3D

我有一个数据集,其中一些十六进制id同时被检测到us(上游)和ds(下游)。在美国和ds两个地点都发现了大约500条鱼。我试图对列hex\u id进行子集划分,以便它只返回hex\u id==us和hex\u 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" & up == "us") %>% 
  summarise(fish = n_distinct(hex_id))
我认为这是因为每个检测都有自己的行,所以在数据表中没有一行同时等于ds和us,而是需要等于和ds的十六进制id


任何建议???

下面为“us”和“ds”创建两个数据子集,然后查找具有匹配十六进制id的所有行

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

如果您想将其恢复为原始格式,您可以旋转表格。

您的方法不起作用的原因是,
loc
的行都不是
“us”
“ds”

下面是一种使用
dplyr
的方法。首先
groupby(hex\u id)
,然后使用
filter
检查
loc
是否包含该组的
“us”
“ds”

pitdata %>%
  group_by(hex_id) %>%
  dplyr::filter(any(loc == "us") & 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%>%
分组依据(十六进制id)%>%
dplyr::过滤器(任意(loc==“us”)&任意(loc==“ds”))
##一个tibble:2x3
##组:十六进制id[1]
#六角id位置详图。
#             
#1 3D9.1C2D9B4717 ds 1
#2 3D9.1C2D9B4717美国1
从这里,很容易数到鱼:

pitdata %>%
  group_by(hex_id) %>%
  dplyr::filter(any(loc == "us") & any(loc == "ds")) %>%
  ungroup %>%
  summarise(fish = n_distinct(hex_id))
# A tibble: 1 x 1
   fish
  <int>
1     1
pitdata%>%
分组依据(十六进制id)%>%
dplyr::筛选器(任意(loc==“us”)&任意(loc==“ds”)%>%
解组%>%
摘要(fish=n_独立(十六进制id))
#一个tibble:1x1
鱼
1     1

另一种方法是通过
loc
det
列(我将
det#
重命名为一个有效的列名)旋转出来,以便更容易过滤。这一切都取决于您希望如何使用数据

库(dplyr)
图书馆(tidyr)
pitdata%>%
枢轴宽度(名称\u from=loc,值\u from=det)%>%
过滤器(!is.na(us),!is.na(ds))
##A tible:1 x 3
#十六进制id us ds
#                
#1 3D9.1C2D9B4717 1 1
pitdata %>%
  group_by(hex_id) %>%
  dplyr::filter(any(loc == "us") & any(loc == "ds")) %>%
  ungroup %>%
  summarise(fish = n_distinct(hex_id))
# A tibble: 1 x 1
   fish
  <int>
1     1