I have a dataframe for races:
df <- data.frame(ID=c(1,2,3,4,5,6), Condition=c(1,2,2,1,1,2), White=c(1,1,NA,NA,NA,NA), Black=c(2,NA,NA,NA,2,NA), Asian=c(NA, NA, NA, 3, 3, 3), AmerIndian=c(NA,NA,4,NA,NA,NA), NatHawaiian=c(NA, NA, NA, 5, NA, NA))
and I'd like to develop a new field for race where whatever Condition 2 is indicated a new field will be filled in.
this is what I tried:
df$var <-ifelse(as.numeric(df$White)==1&!is.na(df$White),"White",
+ ifelse(as.numeric(df$Black)==2&!is.na(df$Black),"Black",
+ ifelse(as.numeric(df$Asian)==3&!is.na(df$Asian),"Asian",
+ ifelse(as.numeric(df$AmerIndian)==4&!is.na(df$AmerIndian),"AmerIndian",
+ ifelse(as.numeric(df$NatHawaiian)==5&!is.na(df$NatHawaiian),"NatHawaiian",NA)))))
and I received this error:
Error in +ifelse(as.numeric(df$NatHawaiian) == 5 & !is.na(df$NatHawaiian), :
invalid argument to unary operator
Based on the code you input and the error generated, I suggest removing the plus symbols at the begining of each ifelse statement. When that is done, the code you shared:
df$var <- ifelse(
as.numeric(df$White) == 1 & !is.na(df$White),
"White", ifelse(
as.numeric(df$Black) == 2 & !is.na(df$Black),
"Black", ifelse(
as.numeric(df$Asian) == 3 & !is.na(df$Asian),
"Asian", ifelse(
as.numeric(df$AmerIndian) == 4 & !is.na(df$AmerIndian),
"AmerIndian", ifelse(
as.numeric(df$NatHawaiian) == 5 &
!is.na(df$NatHawaiian),
"NatHawaiian",
NA
)
)
)
)
)
Will generate this output:
ID Condition White Black Asian AmerIndian NatHawaiian var
1 1 1 1 2 NA NA NA White
2 2 2 1 NA NA NA NA White
3 3 2 NA NA NA 4 NA AmerIndian
4 4 1 NA NA 3 NA 5 Asian
5 5 1 NA 2 3 NA NA Black
6 6 2 NA NA 3 NA NA Asian
you can try with tidyverse
like:
df %>%
gather(key = "race", value = "val", 3:7) %>%
mutate( rc = if_else((Condition == 2 & !is.na(val)), race, NULL)) %>%
spread(race, val)
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.