Why does mutate() give me an error that I should use integer vector while using integer vector?

Viewed 1025
new_data<-new_data%>%
  mutate(dd=case_when(
    edu_yr402==95 ~ NA_integer_,
    edu_yr402==93|edu_yr402==94 ~ 1, 
    TRUE~edu_yr402))

I swear edu_yr402 is an integer vector. I checked it with > class(new_data$edu_yr402) [1] "integer" However, error message is as follows:

Error: Problem with mutate() input dd. x must be an integer vector, not a double vector. i Input dd is case_when(...).

one Commenter said dd becomes logical vector since I put NA in the first string. Thus, I tried

new_data<-new_data%>%
  mutate(dd=case_when(
    edu_yr402==93|edu_yr402==94 ~ 1, 
    TRUE~edu_yr402,
    edu_yr402==95 ~ NA_integer_))

but it gives me error ...

Error: Problem with mutate() input dd. x must be a double vector, not an integer vector. i Input dd is case_when(...).

2 Answers

One possibility to overcome this conflict:

In your console type ?case_when then see the help file:

Here 1L makes 1 to be integer. then you can use NA_integer_ which is the integer type of NA

new_data<-new_data%>%
  mutate(dd=case_when(
    edu_yr402==95 ~ NA_integer_,
    edu_yr402==93|edu_yr402==94 ~ 1L, 
    TRUE~as.integer(edu_yr402)))

Here as.numeric version

new_data<-new_data%>%
  mutate(dd=case_when(
    edu_yr402==95 ~ NA_real_,
    edu_yr402==93|edu_yr402==94 ~ 1, 
    TRUE~as.numeric(edu_yr402)))

As I mentionned, the problem is you have different types of output in a type-strict function (case_when). So it throws you an error. You can do this to resolve it:

new_data%>%
  mutate(dd=case_when(
    edu_yr402==95 ~ as.double(NA),
    edu_yr402==93|edu_yr402==94 ~ 1, 
    TRUE~edu_yr402))

If you want to have integers anyway:

new_data%>%
  mutate(dd=case_when(
    edu_yr402==95 ~ NA_integer_,
    edu_yr402==93|edu_yr402==94 ~ 1L, 
    TRUE~as.integer(edu_yr402)))

Edit: used 1L instead of as.integer(1) as TarJae suggested

Related