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