R 仅在需要时在循环中创建新列

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

我有两个数据帧(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.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