我有这样的数据:
df = as.data.frame(cbind(
event1 = c(88.76,96.04,99.60,88.76,99.60,34.04,96.04,87.03,87.44,87.44),
time1 = c(0.100,0.033,0.000,0.117,0.000,0.000,0.050,0.500,0.133,0.117),
event2 = c(NA,99.60,NA,34.04,99.62,88.76,87.44,87.41,88.76,88.76),
time2 = c(NA,0.050,NA,0.100,0.017,0.083,0.200,0.500,0.133,0.050),
event100 = c(NA,89.52,NA,34.04,93.93,34.02,88.76,88.01,88.01,87.41),
time100 = c(NA,0.050,NA,0.100,0.033,0.117,0.300,0.500,0.233,0.300),
event_88.76_within_0.1 = rep(0,10)
))
其中event1
是主题所具有的第一个事件的代码,time1
是event1
发生之前所花费的时间,并且每个主题最多有100个事件和时间到事件。
我正在尝试创建一个变量(event_88.76_within_0.1
),指示事件88.76是否在0.1分钟内发生。因此,如果任何一个主题的事件等于88.76并且相应的事件时间小于或等于0.1,它将等于1。
使用这个嵌套的for
循环:
for(r in 1:nrow(df)){ #for each subject
for(c in 1:6){ #for each event
if( !is.na(df[r, c]) & df[r, c] == 88.76 & df[r,(c+1)] <= 0.1){
#if the event code is not missing and if it's the needed event code and
#the next column over (the corresponding time to event) is less than 0.1
df[r,"event_88.76_within_0.1"] = 1
}
i = i + 2 #skip 2 columns to get to next event code
}
}
我可以得到这个,这就是我想要的:
event1 time1 event2 time2 event100 time100 event_88.76_within_0.1
[1,] 88.76 0.100 NA NA NA NA 1
[2,] 96.04 0.033 99.60 0.050 89.52 0.050 0
[3,] 99.60 0.000 NA NA NA NA 0
[4,] 88.76 0.117 34.04 0.100 34.04 0.100 0
[5,] 99.60 0.000 99.62 0.017 93.93 0.033 0
[6,] 34.04 0.000 88.76 0.083 34.02 0.117 1
[7,] 96.04 0.050 87.44 0.200 88.76 0.300 0
[8,] 87.03 0.500 87.41 0.500 88.01 0.500 0
[9,] 87.44 0.133 88.76 0.133 88.01 0.233 0
[10,] 87.44 0.117 88.76 0.050 87.41 0.300 1
但是数据集有数千个主题(每个主题有100个可能的事件),因此嵌套的for
循环需要一段时间才能运行。
我想将上面的循环向量化为:
df$event_88.76_within_0.1 = 0
df$event_88.76_within_0.1[df[ "events that equal 88.76 and occurred within 0.1" ]]=1
但我没有运气。
非常感谢任何帮助。
答案 0 :(得分:1)
你可以这样做:
## Define the names of your events and times columns
events = paste0("event",c(1,2,100))
times = paste0("time",c(1,2,100))
## Check if your two conditions are met and multiply the results (multiplying TRUE by TRUE gives 1, multiplying TRUE or FALSE by FALSE returns 0)
df$event_88.76_within_0.1 = pmin(1,rowSums((df[,events]==88.76)*(df[,times]<=0.1),na.rm=T))
event1 time1 event2 time2 event100 time100 event_88.76_within_0.1
1 88.76 0.100 NA NA NA NA 1
2 96.04 0.033 99.60 0.050 89.52 0.050 0
3 99.60 0.000 NA NA NA NA 0
4 88.76 0.117 34.04 0.100 34.04 0.100 0
5 99.60 0.000 99.62 0.017 93.93 0.033 0
6 34.04 0.000 88.76 0.083 34.02 0.117 1
7 96.04 0.050 87.44 0.200 88.76 0.300 0
8 87.03 0.500 87.41 0.500 88.01 0.500 0
9 87.44 0.133 88.76 0.133 88.01 0.233 0
10 87.44 0.117 88.76 0.050 87.41 0.300 1
答案 1 :(得分:0)
这个胶带球怎么样......
cond1 <- df[,seq(1,6,by=2)]==88.76
cond2 <- df[,seq(2,6,by=2)]<=0.1
vec <- which(rowSums(cond1 & cond2, na.rm=T)==1)
df[vec,]
## event1 time1 event2 time2 event100 time100
## 1 88.76 0.100 NA NA NA NA
## 6 34.04 0.000 88.76 0.083 34.02 0.117
## 10 87.44 0.117 88.76 0.050 87.41 0.300