One way to do this is match . First I create a small data frame:
foo <- data.frame( person=c("Mickey","Donald","Daisy","Scrooge"), score=rnorm(4)) foo person score 1 Mickey -0.07891709 2 Donald 0.88678481 3 Daisy 0.11697127 4 Scrooge 0.31863009
Then I make a key:
set.seed(100) key <- as.character(foo$person[sample(1:nrow(foo))])
You should save this key, obviously, somewhere. Now I can code people:
foo$person <- match(foo$person, key) foo person score 1 2 0.3186301 2 1 -0.5817907 3 4 0.7145327 4 3 -0.8252594
If I want the names of people again, I can index key :
key[foo$person] [1] "Mickey" "Donald" "Daisy" "Scrooge"
Or use tranform , it also works if the data is changed, if the person’s ID remains unchanged:
foo <-rbind(foo,foo[sample(1:4),],foo[sample(1:4,2),],foo) foo person score 1 2 0.3186301 2 1 -0.5817907 3 4 0.7145327 4 3 -0.8252594 21 1 -0.5817907 41 3 -0.8252594 31 4 0.7145327 15 2 0.3186301 32 4 0.7145327 16 2 0.3186301 11 2 0.3186301 12 1 -0.5817907 13 4 0.7145327 14 3 -0.8252594 transform(foo, person=key[person]) person score 1 Mickey 0.3186301 2 Donald -0.5817907 3 Daisy 0.7145327 4 Scrooge -0.8252594 21 Donald -0.5817907 41 Scrooge -0.8252594 31 Daisy 0.7145327 15 Mickey 0.3186301 32 Daisy 0.7145327 16 Mickey 0.3186301 11 Mickey 0.3186301 12 Donald -0.5817907 13 Daisy 0.7145327 14 Scrooge -0.8252594
Sacha epskamp
source share