2015-10-07 5 views
1

Я изо всех сил стараюсь сделать что-то, что явно легко.R - рекомендации по перекодировке

У меня есть список кодов и их перекодировка.

> head(codesTv) 

    X5000 TV.Diary.Event 
1 5001   Play 
2 5002 Drama Series 
3 5003 Other Drama 
4 5004   Film 
5 5005  Pop Music 
6 5006   Comedy 

Тогда у меня есть вектор, который необходимо перекодировать по имени ttest.

> head(as.data.frame(ttest)) 
       ttest 
1  SPITTING IMA 
2    5999 
3  KRAMERVSKRAM 
4    NEWS 
5   BROOKSIDE 
6    NOTHING 

Что мне нужно, чтобы просто перекодировать из codesTv значений, которые необходимо закодировать.

Но единственный способ я нашел, чтобы это сделать это громоздкий код:

ttest [ ttest %in% codesTv$X5000 ] = codesTv$TV.Diary.Event [ match(ttest [ttest %in% codesTv$X5000], codesTv$X5000) ] 

ли кто-то есть более простая идея сделать это?

данные

ttest = c("SPITTING IMA", "5999", "KRAMERVSKRAM", "NEWS", "BROOKSIDE", 
"NOTHING", "NOTHING", "BROOKSIDE", "5004", "5004", "5999", "YANKS", 
"5999", "5999", "5999", "5999", "\"V\"", "GET FRESH", "5999", 
"5999", "HEIDI", "FAME", "SAT SHOW", "5021", "BLUE PETER", "V", 
"EASTENDERS", "WORLD CUP", "GRANDSTAND", "SPORT", "WORLD CUP", 
"BLUE PETER", "WORLD CUP", "HORIZON", "REGGIEPERRIN", "5999", 
"BROOKSIDE", "HNKYTNK MAN", "5999", "5999") 

codesTv = structure(list(X5000 = c("5001", "5002", "5003", "5004", "5005", 
"5006", "5007", "5008", "5009", "5010", "5011", "5012", "5013", 
"5014", "5015", "5016", "5017", "5019", "5020", "5021", "5022", 
"5023", "5888", "5999"), TV.Diary.Event = c("Play", "Drama Series", 
"Other Drama", "Film", "Pop Music", "Comedy", "Chat Show", "Quiz/Panel Game", 
"Cartoon", "Special L/E Event", "Classical Music", "Contemporary Music", 
"Arts", "News", "Politics", "Consumer Affairs", "Spec Current Affairs", 
"Documentary", "Religious Affairs", "Sport", "Childrens TV", 
"Party Political", "Continuation Event", "Non-event (Missing)" 
)), .Names = c("X5000", "TV.Diary.Event"), row.names = c(NA, 
-24L), class = "data.frame") 
+0

@Frank да извините! – giacomo

+0

@PierreLafortune Есть три перекрывающих vals: 'intersect (ttest, codesTv $ X5000)' – Frank

+0

гул, а затем как его использовать? – giacomo

ответ

2

решение Ор должно работать нормально. Вот один из способов:

library(data.table) 

# confirm that there is overlap 
intersect(ttest, codesTv$X5000) # "5999" "5004" "5021" 

# replace values in ttest 
setDT(list(X5000=ttest))[codesTv, X5000 := i.TV.Diary.Event, on="X5000"] 

# confirm that the values were overwritten 
intersect(ttest, codesTv$X5000) # character(0) 

Stole this idea from @eddi. Это должно быть эффективно с точки зрения памяти, поскольку мы модифицируем ttest по ссылке вместо создания копии.

+0

приятное решение - просто вопрос: неужели мой громоздкий способ работает правильно? – giacomo

+1

@giacomoV думаю. Он выглядит правильно и также имеет пустое пересечение впоследствии. – Frank

+0

Кстати @Frank - Мне нужно процитировать вашу помощь по нескольким вещам. Каков наилучший способ сделать это, как вы думаете? – giacomo