jeudi 7 juin 2018

New column based on row values - A better way?

There's surely a better way to create a column that matches the 'target' column?

I scoured Stack for an answer, but it appears nobody has needed to know how to do this. Maybe from a completely stupid perspective (my head may have been in Stata mode as that's how my boss thinks, who asked me to create this new 'output' variable).

A       <-c("bears",  "bears",     "na",   "pandas",     "pandas",    "bears",   "pandas")
B       <-c("bears",  "pandas",     "na",   "bears",     "na",          "bears",   "pandas")
target  <-c("bears", "the_zoo",   "na",   "the_zoo",  "pandas",   "bears",   "pandas")
df_test <-data.frame(A,B,target,  stringsAsFactors =FALSE)

class(df_test$B)
for(i in 1:nrow(df_test)){
                          # Case: 1: Both are equal
    df_test$output[i] <- ifelse(df_test$A[i] == df_test$B[i],
                               yes = as.character(df_test$A[i]), 
                               # Case 2: A contains NA
                                no = ifelse(df_test$A[i] == "na",
                                            yes = as.character(df_test$B[i]),
                                            # Case 2.2: B contains NA
                                            no = ifelse(df_test$B[i] =="na",
                                                        yes = as.character(df_test$A[i]),
                                                        # Case 3: All other possibilities are "the_zoo"
                                                        no = "the_zoo"
                                                        )))
                                                    }
df_test



> df_test
       A      B  target  output
1  bears  bears   bears   bears
2  bears pandas the_zoo the_zoo
3     na     na      na      na
4 pandas  bears the_zoo the_zoo
5 pandas     na  pandas  pandas
6  bears  bears   bears   bears
7 pandas pandas  pandas  pandas

Aucun commentaire:

Enregistrer un commentaire