Как делать вложенные циклы for с if - PullRequest
1 голос
/ 09 июля 2020

Edit: На этот вопрос успешно дан ответ.

У меня есть фрейм данных под названием hispn и вектор квинтилей под названием qq_hispn. Hispn имеет два столбца интересов с именем «FAMINC17», который представляет собой семейный доход, и «Стимуляторы».

Я пытаюсь создать новый столбец под названием «Stim_Income», который имеет другое значение для 5 диапазонов доходов и принимают ли они стимуляторы. Таким образом, если они находятся в диапазоне 0-20% от диапазона дохода и принимают стимуляторы, значение равно 1. Если не принимают стимуляторы, значение равно 6. Значения должны быть 2 и 7 для 20-40%, 3 и 8 на 40-60%, et c. Это позволит мне вычислить распространенность по рецепту (1/6, 2/7, и т. Д. c) для каждого квинтиля.

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

  for (i in 1:5) {
    for (j in nrow(hispn)) {
      if ( (hispn[j,"FAMINC17"]>qq_hispn[i])&&(hispn[j,"FAMINC17"]<=qq_hispn[i+1])&&(hispn[j,"Stimulants"]==1) ) {
        hispn[j,"Stim_Income"]<-i
      } else if ( (hispn[j,"FAMINC17"]>qq_hispn[i])&&(hispn[j,"FAMINC17"]<=qq_hispn[i+1])&&(hispn[j,"Stimulants"]==0) ) {
        hispn[j,"Stim_Income"]<-(i+5)
      }
    }
  }

Я пытался реализовать код, который Мишель указала в комментариях, но он вернул ошибку.

  hispn %>% 
    mutate(Stim_Income = case_when (
      FAMINC17>qq_hispn[1] & FAMINC17<=qq_hispn[2] & Stimulants==1  ~ 1
      FAMINC17>qq_hispn[1] & FAMINC17<=qq_hispn[2] & Stimulants==0  ~ 6
      FAMINC17>qq_hispn[2] & FAMINC17<=qq_hispn[3] & Stimulants==1  ~ 2
      FAMINC17>qq_hispn[2] & FAMINC17<=qq_hispn[3] & Stimulants==0  ~ 7
      FAMINC17>qq_hispn[3] & FAMINC17<=qq_hispn[4] & Stimulants==1  ~ 3
      FAMINC17>qq_hispn[3] & FAMINC17<=qq_hispn[4] & Stimulants==0  ~ 8
      FAMINC17>qq_hispn[4] & FAMINC17<=qq_hispn[5] & Stimulants==1  ~ 4
      FAMINC17>qq_hispn[4] & FAMINC17<=qq_hispn[5] & Stimulants==0  ~ 9
      FAMINC17>qq_hispn[5] & FAMINC17<=qq_hispn[6] & Stimulants==1  ~ 5
      FAMINC17>qq_hispn[5] & FAMINC17<=qq_hispn[6] & Stimulants==0  ~ 10
  
     )
    )  

Другой пользователь спросил для воспроизводимых данных и примера вывода.

  m1<- matrix(0,ncol=2,nrow=5)
  m1[1,1]=1000
  m1[2,1]=1000
  m1[3,1]=1000
  m1[4,1]=1000
  m1[5,1]=10000
  m1[3,2]=1

     [,1] [,2]
[1,] 1000    0
[2,] 1000    0
[3,] 1000    1
[4,] 1000    0
[5,] 10000    0

И затем, вот новый столбец с интересующей информацией, если бы for l oop работал бы. Но вместо этого я получил столбец NA.

     [,1] [,2] [,3]
[1,] 1000    0    6
[2,] 1000    0    6
[3,] 1000    1    5
[4,] 1000    0    6
[5,]    0    0    7

1 Ответ

2 голосов
/ 09 июля 2020

На основе некоторых из предоставленных вами деталей я создал образец набора данных. Это не совсем похоже на ваши данные с вектором квинтиля, но вот моя попытка:

library(dplyr)

FAMINC17 <- c('0-20','0-20','20-40', '20-40', '40-60', '40-60', '60-80', '60-80', '80-100', '80-100')
Stimulants <- c(1, 0, 1, 0, 1, 0, 1, 0, 1, 0)

hispn <- data.frame(FAMINC17, Stimulants)

hispn %>% 
  mutate(Stim_Income = case_when(
    FAMINC17 == "0-20"   & Stimulants == 1 ~ 1,
    FAMINC17 == "0-20"   & Stimulants == 0 ~ 6,
    FAMINC17 == "20-40"  & Stimulants == 1 ~ 2,
    FAMINC17 == "20-40"  & Stimulants == 0 ~ 7,
    FAMINC17 == "40-60"  & Stimulants == 1 ~ 3,
    FAMINC17 == "40-60"  & Stimulants == 0 ~ 8,
    FAMINC17 == "60-80"  & Stimulants == 1 ~ 4,
    FAMINC17 == "60-80"  & Stimulants == 0 ~ 9,
    FAMINC17 == "80-100" & Stimulants == 1 ~ 5,
    FAMINC17 == "80-100" & Stimulants == 0 ~ 10,
  ))

Надеюсь, это сработает.

...