这是我的数据库
PERSON_ID EVENT
1 10000000001 LST_Mammo_EPI
2 10000000001 EPI
3 10000000002 BC1
4 10000000002 R_B
5 10000000002 BC2
6 10000000002 DEATH
7 10000000002 EPI
8 10000000004 FST_Mammo_FUP1
9 10000000004 OV1_FUP1
10 10000000004 BC1
11 10000000004 LST_Mammo_EPI
12 10000000004 EPI
13 10000000004 OV2_FUP1
14 10000000004 LST_Mammo_FUP1
15 10000000004 FUP1
16 10000000004 BC2
17 10000000004 FUP2
18 10000000005 LST_Mammo_EPI
19 10000000005 EPI
20 10000000007 BC1
21 10000000007 BC2
22 10000000007 DEATH
23 10000000010 DEATH
24 10000000826 FST_Mammo_FUP1
25 10000000826 BC1
26 10000000826 L_B
27 10000000826 LST_Mammo_EPI
28 10000000826 LST_Mammo_FUP1
29 10000000826 BC2
30 10000000826 R_B
31 10000000826 EPI
32 10000000826 OV1_FUP1
33 10000000826 OV2_FUP1
34 10000000826 OV2_FUP2
35 10000000826 FUP1
36 10000000826 FUP2
37 10000000827 DEATH
38 10000000830 BC1
39 10000000830 DEATH
40 10000000844 LST_Mammo_EPI
所以我编写了一个函数来获取数据子集,让我们说出每个人的特定两个事件之间的任何数据
node <- function(proxis, fulle, database){
result <- NULL
for (ID in unique(database$PERSON_ID)){
person <- subset(database, database$PERSON_ID == ID)
a <- which(person $EVENT == fulle)
if (length(a) == 0 ){
next} else {
person <- person[c(1:a),]
b <- which(person$EVENT == proxis)
if (length(b) == 0) {
next} else{
person <- person[c(b:a),]
a <- which(person$EVENT == "OV")
b <- which(person$EVENT == "BC1")
c <- which(person$EVENT == "BC2")
if (min(a,b,c) != 0) {next
}else{
result <- rbind(result,person)
}}}}
result
}
hello <- node("BC1","BC2",test)
但是这给了我NULL矩阵,当我为特定的人测试没有for循环时,它正确地给了我BC1和BC2之间的数据
我认为中断或分配结果矩阵有问题... 任何人都可以提供见解吗?
答案 0 :(得分:1)
要在两个事件之间获取每个PERSON_ID
的行,我们可以创建一个函数
node <- function(data,event1, event2) {
do.call(rbind, lapply(unique(data$PERSON_ID), function(x)
data[with(data, which(PERSON_ID == x & EVENT == event1) :
which(PERSON_ID == x & EVENT == event2)), ]))
}
注意:如果任何event1
event2
或PERSON_ID
,则会出错