Вложенная петля в заданных условиях - PullRequest
0 голосов
/ 31 октября 2018
    CLID <-c(1,2,1,2)
SUBJ<- c(1,2,3,4)

df<-cbind.data.frame(CLID,SUBJ)

for (TRT in df$CLID){
  for (SUB in df$SUBJ){
if (CLID == 1 & SUBJ==1) {
  df$TRT <- paste("A") 
 } else if  (CLID==1 & SUBJ==2) {
   df$TRT <- paste("B")
  }else if (CLID==1 & SUBJ==4) {
  (TRT <- "C")
  df$TRT <- paste("C")
  }else {
  df$TRT <- paste("NA")
    }
    }
  }

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

Ожидаемый результат:

CLID <-c(1,2,1,2)
SUBJ<- c(1,2,3,4)
TRT<-c("A","NA","NA","C")

df_expected<-cbind.data.frame(CLID,SUBJ,TRT)

1 Ответ

0 голосов
/ 31 октября 2018

Вы можете попробовать это. Это не соответствует ожидаемому результату, хотя. Нигде в вашем цикле нет того, что если CLID == 2 и SUBJ == 4, то TRT должно быть C.

library(dplyr)

df %>%
  mutate(TRT = case_when(
    CLID == 1 & SUBJ == 1 ~ "A",
    CLID == 1 & SUBJ == 2 ~ "B",
    CLID == 1 & SUBJ == 4 ~ "C"
  ))
#>   CLID SUBJ  TRT
#> 1    1    1    A
#> 2    2    2 <NA>
#> 3    1    3 <NA>
#> 4    2    4 <NA>

EDIT

Вот цикл, чтобы сделать то же самое

for(i in 1:nrow(df)){
  if(df$CLID[i] == 1 & df$SUBJ[i] == 1){
    df$TRT[i] <- "A"
  }
  else if(df$CLID[i] == 1 & df$SUBJ[i] == 2){
    df$TRT[i] <- "B"
  }
  else if(df$CLID[i] == 1 & df$SUBJ[i] == 4){
    df$TRT[i] <- "C"
  }
  else{
    df$TRT[i] <- NA
  }
}

df
#>   CLID SUBJ  TRT
#> 1    1    1    A
#> 2    2    2 <NA>
#> 3    1    3 <NA>
#> 4    2    4 <NA>

или другой параметр, использующий вложенные операторы ifelse.

df$TRT <- ifelse(df$CLID == 1 & df$SUBJ == 1, "A", 
                 ifelse(df$CLID == 1 & df$SUBJ == 2, "B",
                        ifelse(df$CLID == 1 & df$SUBJ == 4, "C", NA)))

df
#>   CLID SUBJ  TRT
#> 1    1    1    A
#> 2    2    2 <NA>
#> 3    1    3 <NA>
#> 4    2    4 <NA>
...