我有如下数据:
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>