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% mutate(rownum=ifelse)(is.na(rownum), 行数(其中((ini.1>=(ini.2%中的ini.2%)和(ini.1<(fin.2%中的fin.2))),行数(%>% mutate(New.Grp.ind=Grp.ind[rownum]) 在第二个mutate()中也去掉了which(),但我没有成功。因为我的数据帧有超过6k个观测值,所以我想要一个不使用na.locf的灵活解决方案。我以前尝试过该解决方案,但在整个数据集中表现不佳

有人对如何解决这个问题有指导意见吗


我提前感谢大家的帮助。

使用
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)