R 仅在需要时在循环中创建新列
我有两个数据帧(Spike)和(Stim),每个数据帧都有一列数字(Spike$Time和Stim$start)。参见可复制示例:R 仅在需要时在循环中创建新列,r,dataframe,loops,iteration,R,Dataframe,Loops,Iteration,我有两个数据帧(Spike)和(Stim),每个数据帧都有一列数字(Spike$Time和Stim$start)。参见可复制示例: Time <- c(0.01598,0.05817,1.08353,1.15216,1.15412,2.13952,2.31006,2.31269,2.4119,3.43013,3.57360,4.90991,5.26342,5.72482,6.52477,6.52776,6.66901,7.39100,7.40102,7.76062, 7
Time <- c(0.01598,0.05817,1.08353,1.15216,1.15412,2.13952,2.31006,2.31269,2.4119,3.43013,3.57360,4.90991,5.26342,5.72482,6.52477,6.52776,6.66901,7.39100,7.40102,7.76062,
7.95643,8.34336,9.24355,9.24680,9.77882,10.85945,11.14801,11.15015,11.37721,12.1896,12.19203,12.33352,12.48023,13.43023,13.51819,13.52033,13.84674,15.01894,15.02114,15.34880)
Spike <- as.data.frame(Time)
Onset<- c(2.370653,3.811336,5.255120, 6.501197,7.848100,9.343938,10.843479,12.164387,13.476807,14.922644,16.419281,17.664224,19.112835,20.660367,21.962732,23.213675)
Stim <- as.data.frame(Onset)
我编写了一个循环来完成这项工作:
for(i in 1:nrow(Stim)){
if(Spike$Time[Spike$Time >= Stim$Onset[i]] - Stim$Onset[i] <= 0.6){
Stim$Spike1[i] <- sort(Spike$Time[Spike$Time >= Stim$Onset[i] & Spike$Time - Stim$Onset[i] <= 0.6])[1]
Stim$Spike2[i] <- sort(Spike$Time[Spike$Time >= Stim$Onset[i] & Spike$Time - Stim$Onset[i] <= 0.6])[2]
Stim$Spike3[i] <- sort(Spike$Time[Spike$Time >= Stim$Onset[i] & Spike$Time - Stim$Onset[i] <= 0.6])[3]
Stim$Spike4[i] <- sort(Spike$Time[Spike$Time >= Stim$Onset[i] & Spike$Time - Stim$Onset[i] <= 0.6])[4]
Stim$Spike5[i] <- sort(Spike$Time[Spike$Time >= Stim$Onset[i] & Spike$Time - Stim$Onset[i] <= 0.6])[5]
Stim$Spike6[i] <- sort(Spike$Time[Spike$Time >= Stim$Onset[i] & Spike$Time - Stim$Onset[i] <= 0.6])[6]
Stim$Spike7[i] <- sort(Spike$Time[Spike$Time >= Stim$Onset[i] & Spike$Time - Stim$Onset[i] <= 0.6])[7]
Stim$Spike8[i] <- sort(Spike$Time[Spike$Time >= Stim$Onset[i] & Spike$Time - Stim$Onset[i] <= 0.6])[8]
Stim$Spike9[i] <- sort(Spike$Time[Spike$Time >= Stim$Onset[i] & Spike$Time - Stim$Onset[i] <= 0.6])[9]
Stim$Spike10[i] <- sort(Spike$Time[Spike$Time >= Stim$Onset[i] & Spike$Time - Stim$Onset[i] <= 0.6])[10]
} else {
Stim$Spike1[i] <- NA
Stim$Spike2[i] <- NA
Stim$Spike3[i] <- NA
Stim$Spike4[i] <- NA
Stim$Spike5[i] <- NA
Stim$Spike6[i] <- NA
Stim$Spike7[i] <- NA
Stim$Spike8[i] <- NA
Stim$Spike9[i] <- NA
Stim$Spike10[i] <- NA
}
}
适用于(i/1:nrow(Stim)){
如果(Spike$Time[Spike$Time>=Stim$start[i]]-Stim$start[i]此解决方案不适用于循环,而是使用连接方法。但您只获得了最小数量的时间列-例如示例4
library(fuzzyjoin)
library(tidyverse)
Stim %>%
fuzzy_left_join(Spike,
by = c("Onset" = "Time"),
match_fun = function(x,y) (y - x) > 0 & (y - x) <= .6) %>%
group_by(Onset) %>%
mutate(number = row_number()) %>%
pivot_wider(names_from = number, values_from = Time, names_prefix = "Time")
库(fuzzyjoin)
图书馆(tidyverse)
刺激%>%
模糊左联合(尖峰,
by=c(“开始时间”=“时间”),
匹配=函数(x,y)(y-x)>0和(y-x)%
组(发病)%>%
变异(编号=行号())%>%
枢轴(名称从=数字,值从=时间,名称前缀=“时间”)
输出
# A tibble: 16 x 5
# Groups: Onset [16]
Onset Time1 Time2 Time3 Time4
<dbl> <dbl> <dbl> <dbl> <dbl>
1 2.37 2.41 NA NA NA
2 3.81 NA NA NA NA
3 5.26 5.26 5.72 NA NA
4 6.50 6.52 6.53 6.67 NA
5 7.85 7.96 8.34 NA NA
6 9.34 9.78 NA NA NA
7 10.8 10.9 11.1 11.2 11.4
8 12.2 12.2 12.2 12.3 12.5
9 13.5 13.5 13.5 13.8 NA
10 14.9 15.0 15.0 15.3 NA
11 16.4 NA NA NA NA
12 17.7 NA NA NA NA
13 19.1 NA NA NA NA
14 20.7 NA NA NA NA
15 22.0 NA NA NA NA
16 23.2 NA NA NA NA
#一个tible:16 x 5
#组:发病[16]
开始时间1时间2时间3时间4
1 2.37 2.41不适用
2.3.81不适用
3 5.26 5.26 5.72不适用
4 6.50 6.52 6.53 6.67 NA
5 7.85 7.96 8.34不适用
6 9.34 9.78不适用不适用不适用
7 10.8 10.9 11.1 11.2 11.4
8 12.2 12.2 12.2 12.3 12.5
9 13.5 13.5 13.5 13.8不适用
1014.915.015.015.3北美
11.16.4不适用
12.17.7不适用
13.19.1不适用
14 20.7不适用
15 22.0不适用
16 23.2不适用
# A tibble: 16 x 5
# Groups: Onset [16]
Onset Time1 Time2 Time3 Time4
<dbl> <dbl> <dbl> <dbl> <dbl>
1 2.37 2.41 NA NA NA
2 3.81 NA NA NA NA
3 5.26 5.26 5.72 NA NA
4 6.50 6.52 6.53 6.67 NA
5 7.85 7.96 8.34 NA NA
6 9.34 9.78 NA NA NA
7 10.8 10.9 11.1 11.2 11.4
8 12.2 12.2 12.2 12.3 12.5
9 13.5 13.5 13.5 13.8 NA
10 14.9 15.0 15.0 15.3 NA
11 16.4 NA NA NA NA
12 17.7 NA NA NA NA
13 19.1 NA NA NA NA
14 20.7 NA NA NA NA
15 22.0 NA NA NA NA
16 23.2 NA NA NA NA