R:如果一列中的值位于其他两列中可能的一对值之间,则按组标识行号
我有一个问题可能很简单,但我就是想不出来。我的数据帧示例如下所示:R:如果一列中的值位于其他两列中可能的一对值之间,则按组标识行号,r,R,我有一个问题可能很简单,但我就是想不出来。我的数据帧示例如下所示: > df.corrected Grp Grp.ind ini.1 fin.1 ini.2 fin.2 1 A A.1 0 5 0 5 2 A A.2 5 10 5 25 3 A A.3 10 15 NA NA 4 A A.4 15 26 NA NA
> df.corrected
Grp Grp.ind ini.1 fin.1 ini.2 fin.2
1 A A.1 0 5 0 5
2 A A.2 5 10 5 25
3 A A.3 10 15 NA NA
4 A A.4 15 26 NA NA
5 A A.5 26 28 NA NA
6 A A.6 28 30 25 30
7 B B.1 0 15 0 10
8 B B.2 NA NA 10 20
9 B B.3 15 20 20 25
10 B B.4 20 31 25 30
11 B B.5 31 50 30 50
> df.corrected
Grp Grp.ind ini.1 fin.1 ini.2 fin.2 rownum New.Grp.ind
1 A A.1 0 5 0 5 1 A.1
2 A A.2 5 10 5 25 2 A.2
3 A A.3 10 15 NA NA 2 A.2
4 A A.4 15 26 NA NA 2 A.2
5 A A.5 26 28 NA NA 6 A.6
6 A A.6 28 30 25 30 6 A.6
7 B B.1 0 15 0 10 1 B.1
8 B B.2 NA NA 10 20 NA B.2
9 B B.3 15 20 20 25 2 B.2
10 B B.4 20 31 25 30 3 B.3
11 B B.5 31 50 30 50 5 B.5
我想在每组中查找行数,其中每个观察值的ini.1位于可能的ini.2和fin.2值之间(即ini.2%
变异(rownum=ifelse(!(ini.1>=ini.2&ini.1我提前感谢大家的帮助。使用
dplyr
的方法是通过Grp
自动加入df.corrected
,然后应用filter
以满足OP提到的规则。这将为匹配条件提供New.Grp.ind
。最后,对于无法满足匹配规则的行,我们已经提供了通过Grp
和Grp.ind
纠正df
,使用right\u join
)连接回(使用right\u join
)
注意:我假设Grp+Grp.ind
表示数据中唯一的一行。如果不是,则应在数据中添加一个行号
,该行号可以用作右键联接的一部分
library(dplyr)
df.corrected %>% inner_join((df.corrected %>% group_by(Grp) %>%
mutate(rownum= row_number())), by="Grp") %>%
filter(ini.1.x >=ini.2.y & ini.1.x < fin.2.y) %>%
select( Grp, Grp.ind = Grp.ind.x, ini.1 = ini.1.x, fin.1 = fin.1.x, ini.2 = ini.2.x,
fin.2 = fin.2.x, rownum, New.Grp.ind = Grp.ind.y) %>%
right_join(df.corrected, by=c("Grp","Grp.ind")) %>%
select( Grp, Grp.ind, ini.1 = ini.1.x, fin.1 = fin.1.x, ini.2 = ini.2.x, fin.2 = fin.2.x,
rownum, New.Grp.ind) %>%
mutate(New.Grp.ind = coalesce(New.Grp.ind, Grp.ind))
# Grp Grp.ind ini.1 fin.1 ini.2 fin.2 rownum New.Grp.ind
# 1 A A.1 0 5 0 5 1 A.1
# 2 A A.2 5 10 5 25 2 A.2
# 3 A A.3 10 15 NA NA 2 A.2
# 4 A A.4 15 26 NA NA 2 A.2
# 5 A A.5 26 28 NA NA 6 A.6
# 6 A A.6 28 30 25 30 6 A.6
# 7 B B.1 0 15 0 10 1 B.1
# 8 B B.2 NA NA NA NA NA B.2
# 9 B B.3 15 20 20 25 2 B.2
# 10 B B.4 20 31 25 30 3 B.3
# 11 B B.5 31 50 30 50 5 B.5
库(dplyr)
df.corrected%%>%内部联接((df.corrected%%>%groupby(Grp)%%
变异(rownum=row_number()),通过=“Grp”)%>%
过滤器(ini.1.x>=ini.2.y&ini.1.x%
选择(Grp,Grp.ind=Grp.ind.x,ini.1=ini.1.x,fin.1=fin.1.x,ini.2=ini.2.x,
fin.2=fin.2.x,rownum,New.Grp.ind=Grp.ind.y)%>%
右连接(df.corrected,by=c(“Grp”,“Grp.ind”))%>%
选择(Grp,Grp.ind,ini.1=ini.1.x,fin.1=fin.1.x,ini.2=ini.2.x,fin.2=fin.2.x,
rownum,New.Grp.ind)%>%
突变(New.Grp.ind=合并(New.Grp.ind,Grp.ind))
#Grp Grp.ind ini.1 fin.1 ini.2 fin.2 rownum New.Grp.ind
#1 A.1 0 5 0 5 1 A.1
#2 A.2 5 10 5 25 2 A.2
#3 A.3 10 15 NA 2 A.2
#4 A.4 15 26 NA 2 A.2
#5 A.5 26 28 NA 6 A.6
#6 A.6 28 30 25 30 6 A.6
#7 B.1 0 15 0 10 1 B.1
#8 B.2不适用于B.2
#9 B B.3 15 20 25 2 B.2
#10 B B.4 20 31 25 30 B.3
#11 B.5 31 50 30 50 5 B.5
数据:
df.corrected <- read.table(text =
"Grp Grp.ind ini.1 fin.1 ini.2 fin.2
1 A A.1 0 5 0 5
2 A A.2 5 10 5 25
3 A A.3 10 15 NA NA
4 A A.4 15 26 NA NA
5 A A.5 26 28 NA NA
6 A A.6 28 30 25 30
7 B B.1 0 15 0 10
8 B B.2 NA NA 10 20
9 B B.3 15 20 20 25
10 B B.4 20 31 25 30
11 B B.5 31 50 30 50",
header = TRUE, stringsAsFactors = FALSE)
<代码> DF.纠正了如果有多个重叠,你想要多行吗?即使没有重叠,在第2行的表中,例如用<代码> @ Mike H.,我没有考虑重叠,因为我没有在我的数据上看到任何东西。@ Calum。你是对的。当我编码R时,它没有给我显示那些双匹配。我会编辑这个问题,所以它是。伊尼。2@Javmi我已经添加了一个答案。如果这是您想要的,请看一看并提供反馈。我故意将第8行的新.Grp.ind
保留为NA
。如果您确实需要,可以将其更改为B.2',如所需的输出所示。您正确地假设每个Gr+Grp\u ind都是唯一的
df.corrected <- read.table(text =
"Grp Grp.ind ini.1 fin.1 ini.2 fin.2
1 A A.1 0 5 0 5
2 A A.2 5 10 5 25
3 A A.3 10 15 NA NA
4 A A.4 15 26 NA NA
5 A A.5 26 28 NA NA
6 A A.6 28 30 25 30
7 B B.1 0 15 0 10
8 B B.2 NA NA 10 20
9 B B.3 15 20 20 25
10 B B.4 20 31 25 30
11 B B.5 31 50 30 50",
header = TRUE, stringsAsFactors = FALSE)