R: пропустить пустые элементы во время векторизации - PullRequest
0 голосов
/ 27 января 2020

Привет, я пытаюсь научиться Векторизации в R.

У меня есть следующий код:

set.seed(23)
obs_num=100
Observation=seq(1,obs_num)
Location_Type1=sample(1:2, obs_num, replace=T)
Location_Type2=sample(1:2, obs_num, replace=T) 
# The above does not lead to any errors

#Location_Type2=sample(1, obs_num, replace=T) 
##Error occurs when I use this formula instead.

low_bound = runif(obs_num,0,1)
mean = runif(obs_num,10,15)
df1= data.frame(Observation,Location_Type1,Location_Type2,mean,low_bound)

Vectorized_function=function(data){
  #Create groups
  i1= data[["Location_Type1"]] == 1 & data[["Location_Type2"]] == 1
  i2= data[["Location_Type1"]] == 2 & data[["Location_Type2"]] == 1
  i3= data[["Location_Type1"]] == 1 & data[["Location_Type2"]] == 2
  i4= data[["Location_Type1"]] == 2 & data[["Location_Type2"]] == 2
  #Draw values
  data[i1, "draw_value"] <- rtruncnorm(sum(i1),a=data[i1,'low_bound'],mean = data[i1, "mean"])
  data[i2, "draw_value"] <- rtruncnorm(sum(i2),a=data[i2,'low_bound'],mean = data[i2, "mean"])
  data[i3, "draw_value"] <- rtruncnorm(sum(i3),a=data[i3,'low_bound'],mean = data[i3, "mean"])
  data[i4, "draw_value"] <- rtruncnorm(sum(i4),a=data[i4,'low_bound'],mean = data[i4, "mean"])
  data
}

getvalue = Vectorized_function(data=df1)

В df1 есть два столбца, Location_Type1 и Location_Type2, каждый из которых может занять значение 1 или 2. Приведенный выше код работает, когда существуют четыре комбинации.

a) Location_Type1 = 1 & Location_Type2 = 1;

b) Location_Type1 = 1 & Location_Type2 = 2;

c) Location_Type1 = 2 & Location_Type2 = 1

d) Location_Type1 = 2 & Location_Type2 = 2]

То, что я пытаюсь сделать, это извлечь из усеченного нормальное распределение на основе вышеуказанных четырех условий. В моих реальных данных это не всегда может случиться.

Чтобы повторить эту ситуацию, предположим, что мы изменили следующую строку в приведенном выше коде:

Location_Type2=sample(1, obs_num, replace=T) #This implies LocatioN_Type2 is only one type

В этом случае я получаю сообщение об ошибке:

Ошибка в rtruncnorm (сумма (i3), a = данные [i3, "low_bound"], среднее значение = данные [i3,: length (a)> 0 не соответствует TRUE

Я вижу, что По существу, не существует никаких наблюдений, которые удовлетворяют условиям i3 и i4 (то есть сумма (i3) и сумма (i4) = 0). В этом случае часть для нижней границы ("a" в коде) вызывает проблема.

Может кто-нибудь подсказать, как обеспечить обработку этих ситуаций в коде? Я хочу, чтобы векторизованная функция могла обрабатывать ситуации, когда любое из условий пусто.

1 Ответ

0 голосов
/ 27 января 2020

Следуя комментарию @ akrun, я настроил функцию следующим образом:

Vectorized_function=function(data){
  #Create groups
  i1= data[["Location_Type1"]] == 1 & data[["Location_Type2"]] == 1
  i2= data[["Location_Type1"]] == 2 & data[["Location_Type2"]] == 1
  i3= data[["Location_Type1"]] == 1 & data[["Location_Type2"]] == 2
  i4= data[["Location_Type1"]] == 2 & data[["Location_Type2"]] == 2
  #Draw values
  data[i1, "draw_value"] <- try(rtruncnorm(sum(i1),a=data[i1,'low_bound'],mean = data[i1, "mean"]),silent = T)
  data[i2, "draw_value"] <- try(rtruncnorm(sum(i2),a=data[i2,'low_bound'],mean = data[i2, "mean"]),silent = T)
  data[i3, "draw_value"] <- try(rtruncnorm(sum(i3),a=data[i3,'low_bound'],mean = data[i3, "mean"]),silent = T)
  data[i4, "draw_value"] <- try(rtruncnorm(sum(i4),a=data[i4,'low_bound'],mean = data[i4, "mean"]),silent = T)
  data
}

Похоже, что это работает на данный момент и может привести к ошибке при отсутствии / отсутствии наблюдения.

...