简体   繁体   中英

Assigning Values to Existing and New factors

I have a data frame test:

Test <- data.frame( Number = c(1,2,3), Item = c("Sars-Cov","Influenza","Unknown Flu"))

#   Number        Item
# 1      1    Sars-Cov
# 2      2   Influenza
# 3      3 Unknown Flu

Then, after adding two elements "Influenza" it becomes:

Test2 <- data.frame( Number = c(1,2,3,"N.a","N.a"), Item = c("Sars-Cov","Influenza","Unknown Flu","Influenza","Influenza"))

#   Number        Item
# 1      1    Sars-Cov
# 2      2   Influenza
# 3      3 Unknown Flu
# 4    N.a   Influenza
# 5    N.a   Influenza

Which code should I use to column number turns to a result like this?:

Test3 <- data.frame( Number = c(1,2,3,2,2), Item = c("Sars-Cov","Influenza","Unknown Flu","Influenza","Influenza"))

#   Number        Item
# 1      1    Sars-Cov
# 2      2   Influenza
# 3      3 Unknown Flu
# 4      2   Influenza
# 5      2   Influenza

Actually I have an Item list larger than this example with different elements that I want to be recognized in order of appearence as intergers.

You can use fill() from tidyr .

library(dplyr)
library(tidyr)

Test2 %>%
  mutate(Number = na_if(Number, "N.a")) %>% 
  group_by(Item) %>%
  fill(Number, .direction = "downup")

#   Number Item       
#   <chr>  <chr>      
# 1 1      Sars-Cov   
# 2 2      Influenza  
# 3 3      Unknown Flu
# 4 2      Influenza  
# 5 2      Influenza

Or by match() :

Test2 %>%
  mutate(Number = na_if(Number, "N.a"),
         Number = {
           ind <- is.na(Number)
           replace(Number, ind, Number[!ind][match(Item[ind], Item[!ind])])
         })

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM