0

I'm new to R. I was hoping for some guidance on my hw question. I'm trying to assign labels up and down to a variable. The code is running but I keep getting NA as values. Here is my code:

NewVar <- if_else(data1$NewVar>median(data1$NewVar, na.rm = TRUE),"1","0")
factor(NewVar)
factor(NewVar, levels=c("up","down"))

output:

  [1] 0    0    0    1    0    1    1    0    1    0    1    1    0    0    0    0    1    1    0    0    0    0    0    1    0    1    0    0    1   
 [30] 0    0    1    1    1    1    0    1    1    0    1    1    0    0    1    0    0    0    0    0    1    1    1    1    0    0    0    0    1   
 [59] 1    1    0    1    1    0    1    0    0    1    1    0    1    0    0    0    1    1    0    0    0    0    1    0    1    0    1    1    1   
 [88] 0    0    0    0    0    1    1    1    0    0    1    0    0    1    1    1    1    1    0    1    1    0    1    0    1    1    1    1    0   
[117] 0    1    0    1    1    1    0    0    1    0    1    0    1    1    0    1    1    1    1    1    1    NA 0    0    0   

Levels: 0 1

  [1] NA <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
 [30] NA <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> NA <NA> <NA> <NA> <NA> <NA> <NA> <NA>
 [59] NA <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> NA <NA> <NA> <NA> <NA> <NA> <NA> <NA>
 [88] NA <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
[117] NA <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
Levels: high low

Any idea on how to fix this?

Gerhard
  • 6,850
  • 8
  • 51
  • 81
  • 1
    Notice the difference between `levels=` here and @Ben's use of `labels=`. From `?factor`, levels is *"an optional vector of the unique values ... that 'x' might have taken"*, but `"up"` and `"down"` are not observed in your vector of `"1"`/`"0"`. If you change your code to use `labels=` instead, it should work. – r2evans Apr 07 '21 at 01:54

1 Answers1

1

Please take a minute to check this: How to make a great R reproducible example post out. It will help you ask more questions regarding R.

what you'll want, is the following:

library(dplyr)
set.seed(4211)
old <- c(rnorm(100), NA)

NewVar <- if_else(old>median(old, na.rm = TRUE),"1","0")
factor(NewVar, labels=c("up","down"))
  [1] up   up   down down down up   down down down up   up   down down up   down up  
 [17] up   up   up   up   down down down down down up   up   down up   down up   down
 [33] up   down down down up   up   up   down up   up   up   down up   down up   down
 [49] down up   up   up   down down down down down up   down up   down down down up  
 [65] down up   up   up   down up   down down down down down down up   up   down up  
 [81] up   up   up   down up   up   up   up   up   up   down down up   down up   up  
 [97] up   down down down <NA>
Levels: up down

In this example, old is just some vector, much like your data$NewVar variable. What you are doing wrong in your code is that you are calling factor() twice. Moreover, you want to set the labels, not the levels. Moreover, you might also want to include the levels parameter, to specify which of the 1, 0s is corresponding to which label. To do so, just add levels=c("0","1") or levels=c("1", "0") to your function call, depending on whether "0" stands for up or down. It probably stands for down, so levels=c("1", "0") would be the way to go.

Ben
  • 784
  • 5
  • 14