基于前几行提取匹配条件的行-r



我有如下数据:

time = 1:22
device =  c(rep(9,8), rep(3,6),rep(17,8))
antenna = c(2,1,2,2,1,1,2,1,2,2,2,2,2,2,1,2,1,2,1,1,1,1)
ID = c("A","A",NA,"B",NA,"B",NA,NA,"B",NA,"B",NA,"C",NA,"A","B",NA,NA,"B",NA,"B",NA)
df <- data.frame(time, device,antenna,ID)
df
#    time device antenna   ID
# 1     1      9       2    A
# 2     2      9       1    A
# 3     3      9       2 <NA>
# 4     4      9       2    B
# 5     5      9       1 <NA>
# 6     6      9       1    B
# 7     7      9       2 <NA>
# 8     8      9       1 <NA>
# 9     9      3       2    B
# 10   10      3       2 <NA>
# 11   11      3       2    B
# 12   12      3       2 <NA>
# 13   13      3       2    C
# 14   14      3       2 <NA>
# 15   15     17       1    A
# 16   16     17       2    B
# 17   17     17       1 <NA>
# 18   18     17       2 <NA>
# 19   19     17       1    B
# 20   20     17       1 <NA>
# 21   21     17       1    B
# 22   22     17       1 <NA>

有许多设备,每个设备都可以有两个天线(1或2-antenna列(。在ID栏中,我们有一个ID或NA。

我需要提取的是每一行中都有一个ID,再加上数据集中ID列中有NA的下一行,该行的设备/天线组合与前一个ID完全相同。

例如,行4具有设备=9,天线=2,id=B。我需要该行和具有NA但具有设备=2,天线=1,id=NA的下一行,这是行7。

所需输出

#A: 
df[c(1,3,2,5,15,17),]
#    time device antenna   ID
# 1     1      9       2    A
# 3     3      9       2 <NA>
# 2     2      9       1    A
# 5     5      9       1 <NA>
# 15   15     17       1    A
# 17   17     17       1 <NA>

#B:
df[c(4,7,6,8,9,10,11,12,16,18,19,20,21),]
#   time device antenna   ID
#4     4      9       2    B
#7     7      9       2 <NA>
#6     6      9       1    B
#8     8      9       1 <NA>
#9     9      3       2    B
#10   10      3       2 <NA>
#11   11      3       2    B
#12   12      3       2 <NA>
#16   16     17       2    B
#18   18     17       2 <NA>
#19   19     17       1    B
#20   20     17       1 <NA>
#21   21     17       1    B

#C:
df[c(13,14),]

#  time device antenna   ID
#13   13      3       2    C
#14   14      3       2 <NA>

我考虑过通过对每个设备和天线组合进行子集设置,然后将其拼接在一起(尽管请注意,一些设备/天线对可能不会显示在数据中(:

subset(df, df$device==9 & df$antenna==2)
subset(df, df$device==17 & df$antenna==1)
subset(df, df$device==3 & df$antenna==1)

我想知道我的方法是否有效,或者有更好的方法吗?

创建一个Match函数,在给定非NA行的情况下查找匹配的NA-ID行,然后拆分df并将其应用于每个组件。请注意,时间等于问题中的行号,我们已经假设了这一点。

Match <- function(row) {
subset(df, device == row$device & 
antenna == row$antenna &
time > row$time &
is.na(ID))[1, "time"]
}
f <- function(x) df[c(sapply(1:nrow(x), function(i) c(x$time[i], Match(x[i, ])))), ]
lapply(split(df, df$ID), f)

给予:

$A
time device antenna   ID
1     1      9       2    A
3     3      9       2 <NA>
2     2      9       1    A
5     5      9       1 <NA>
15   15     17       1    A
17   17     17       1 <NA>
$B
time device antenna   ID
4     4      9       2    B
7     7      9       2 <NA>
6     6      9       1    B
8     8      9       1 <NA>
9     9      3       2    B
10   10      3       2 <NA>
11   11      3       2    B
12   12      3       2 <NA>
16   16     17       2    B
18   18     17       2 <NA>
19   19     17       1    B
20   20     17       1 <NA>
21   21     17       1    B
22   22     17       1 <NA>
$C
time device antenna   ID
13   13      3       2    C
14   14      3       2 <NA>

最新更新