2013-03-20 3 views
0

Я хотел бы заменить все значения в списке (An) с их соответствующими значениями в другом фрейме.R: Заменить все значения в списке в соответствии с правилами в другом фрейме данных

String<-c("a","b","c") 
Strn<-1:length(String)        
LK<-data.frame(String,Strn) 
An<-as.vector(permn(length(Strn))) 

Я создал простой пример выше всего 3 элементов, но у меня есть много лагера и более разнообразный список в моих данных (отсюда простой IfElse перекодировать бы слишком долго). Поэтому здесь я хочу, чтобы «a» было заменено на 1, b с 2 и c с 3 по всему списку, потому что это «правила», найденные в LK.

Есть ли способ рассказать R: посмотреть на каждый элемент в An, найти совпадение в LK $ Strn и заменить An на LK $ String?

Так начало результирующего списка будет

[[1]] 
[1] "a" "b" "c" 

[[2]] 
[1] "a" "c" "b" 

Очевидно, что полный результирующий список будет иметь тот же размер, как An.

Я попытался match(), но я должен делать что-то не так ...

Любая помощь будет принята с благодарностью.

ответ

1

Вы можете сделать это с быстрым lapply как так ...

res <- lapply(An , function(x){ x <- as.character(LK[ match(x , LK$Strn) , "String" ]) }) 

    res 
# [[1]] 
# [1] "a" "b" "c" 

# [[2]] 
# [1] "a" "c" "b" 

# [[3]] 
# [1] "c" "a" "b" 

# [[4]] 
# [1] "c" "b" "a" 

# [[5]] 
# [1] "b" "c" "a" 

# [[6]] 
# [1] "b" "a" "c" 
+1

можно упростить эту функцию в общем случае, как: 'lapply (An, функция (х) буквы [х])'. Или здесь, 'lapply (An, function (x) String [x])' – Arun

+0

@Arun очень приятно. Хотелось бы, чтобы я подумал об этом, но он зависит от a = 1, b = 2 и т. Д., Всегда являясь истинным. (что, вероятно, есть). –

+0

да действительно. он работает для этой * конкретной * проблемы. – Arun

Смежные вопросы