цикл for завершается с ошибкой из-за последовательности итераций, содержащих десятичные дроби меньше единицы

#r #for-loop #dplyr

#r #цикл for #dplyr

Вопрос:

Это сложная проблема. Во-первых, my for-loop выдает ошибку «Ошибка в datalist[[i]] <- x: попытка выбрать менее одного элемента в integerOneIndex» при вводе последовательности итераций, содержащих значения < 1. Во-вторых, при установке последовательности итераций, содержащей значения > = 1, из этого диапазона берется только наибольшее значение. Когда я проверяю, чтобы увидеть последовательность итераций, содержащих значения> 1, цикл for работает нормально.

 # Example data 
df <- data.frame(variable = rep(letters[1:4],3),
             SteadyState = sample(0:1,12,replace = T),
             measurement = sample(0:20,12))

# Range containing values less than 1
range_less_than_1 <- seq(0.25,0.75,length.out = 4) # Throws error message

# Range containing values  >= 1
range_greater_than_1 <- seq(1,1.75,length.out = 4) # Only 1.75 operates

# Range containing values > 1
range_much_greater_than_1 <- seq(2,20,length.out = 4) # Works fine

datalist <- list()
for (i in range_less_than_1){
  x <- df %>% 
    group_by(variable)%>% 
summarise(`Range (<)`=i,
          TP = length(which(measurement <= i amp; SteadyState == 1)),
          FP = length(which(measurement <= i amp; SteadyState == 0)),
          FN = length(which(measurement > i amp; SteadyState == 1)),
          TN = length(which(measurement > i amp; SteadyState == 0)))
datalist[[i]] = x
}
df_2 = do.call(rbind,datalist) 
  

Желаемый результат:

 seq(0.25,1.75, length.out=5)
# [1] 0.250 0.625 1.000 1.375 1.750
  
 > df_2
# A tibble: 16 x 6
   variable `Range (<)`    TP    FP    FN    TN
   <fct>          <dbl> <int> <int> <int> <int>
 1 a               0.25     0     1     2     0
 2 b               0.25     0     0     3     0
 3 c               0.25     1     0     1     1
 4 d               0.25     0     0     2     1
 5 a              0.625     1     1     1     0
 6 b              0.625     1     0     2     0
 7 c              0.625     2     0     0     1
 8 d              0.625     0     0     2     1
 9 a                 1      2     1     0     0
10 b                 1      2     0     1     0
11 c                 1      2     0     0     1
12 d                 1      0     1     2     0
13 a              1.375     2     1     0     0
14 b              1.375     3     0     0     0
15 c              1.375     2     1     0     0
16 d              1.375     2     1     0     0
17 a              1.750     0     1     2     0
18 b              1.750     0     0     3     0
19 c              1.750     0     0     2     1
20 d              1.750     0     0     2     1
  

Ответ №1:

Попробуйте это —

 datalist <- list()
    for (i in 1:length(range_less_than_1)){
      x <- df %>% 
      group_by(variable)%>% 
      summarise(`Range (<)`= range_less_than_1[i],
              TP = length(which(measurement <= range_less_than_1[i] amp; SteadyState == 1)),
              FP = length(which(measurement <= range_less_than_1[i] amp; SteadyState == 0)),
              FN = length(which(measurement > range_less_than_1[i] amp; SteadyState == 1)),
              TN = length(which(measurement > range_less_than_1[i] amp; SteadyState == 0)))
  datalist[[i]] = x
}

> df_2 = do.call(rbind,datalist)
> df_2
# A tibble: 16 x 6
   variable `Range (<)`    TP    FP    FN    TN
   <fct>          <dbl> <int> <int> <int> <int>
 1 a              0.25      0     1     0     2
 2 b              0.25      0     0     1     2
 3 c              0.25      0     0     2     1
 4 d              0.25      0     0     1     2
 5 a              0.417     0     1     0     2
 6 b              0.417     0     0     1     2
 7 c              0.417     0     0     2     1
 8 d              0.417     0     0     1     2
 9 a              0.583     0     1     0     2
10 b              0.583     0     0     1     2
11 c              0.583     0     0     2     1
12 d              0.583     0     0     1     2
13 a              0.75      0     1     0     2
14 b              0.75      0     0     1     2
15 c              0.75      0     0     2     1
16 d              0.75      0     0     1     2
  

Комментарии:

1. Привет, Рушабх, это не сработало. Мне нужно сохранить значения i в виде десятичных дробей. Использование length() просто возвращает количество элементов в этом диапазоне, а не фактические значения.

2. можете ли вы опубликовать ожидаемый результат?

3. Потрясающе! Сработало как по волшебству! Какова логика, стоящая за необходимостью кодировать range_less_than_1[i] ?

4. Вы вызываете ith элемент range_less_than_1 последовательности / вектора.