2017-02-07 2 views
0

У меня есть 3 столбца имен (соответствующих разным диатомовым видам). Первый столбец - это текущее имя моего вида, второй столбец - это «старый» (т. Е. Не используется) название вида, а третий - «новое» (т. Е. После таксономического обновления) название вида.Найти элементы в одном векторе и заменить их эквивалентами в другом векторе в R

Для каждого значения в первом столбце мне нужно найти его во втором столбце, и если он найден, мне нужно заменить его обновленным именем (сохраненным в третьем столбце). Так, например, учитывая эту матрицу:

Column 1     Column 2    Column 3 
Achnanthes.atomus   Amphora.coffeaeformis Halamphora.coffeaeformis 
Achnanthes.biasolettiana Achnanthes.atomus  Achnanthidium.atomus 

Achnanthes.atomus найдено в колонке 1 (первая строка), должны быть идентифицированы в колонке 2 (второй строки) и заменить его новым именем «» Achnanthidium.atomus (колонка 2, второй ряд).

Моя матрица называется Diatosdef. Если я сделаю это, он работает:

colnames(Diatosdef) <- gsub("Achnanthes.atomus","Achnanthidium.atomus",colnames(Diatosdef)) 

Но мне нужно сделать это видовое по видам, и у меня есть почти 100 видов

Может кто-нибудь пожалуйста помочь мне?

Спасибо!

PS: Я обнаружил, что я могу сделать это в Excel с помощью функции ВПР, но я до сих пор ищет способ сделать это в R

+0

Hi! Моя матрица называется «Diatosdef». Поэтому, если я это сделаю, он работает: colnames (Diatosdef) <- gsub («Achnanthes.atomus», «Achnanthidium.atomus», colnames (Diatosdef)). Но мне нужно делать это по видам, а у меня почти 100 видов ... – user2963185

ответ

-1

вы можете попробовать это:

for(i in matrix[:1]){ 
    if(matrix[i:1] == matrix[i:2]) 
    matrix[i:1] = matrix[i:3] 
} 

может быть синтаксис неверен.

+0

Спасибо Даниэле. К сожалению, когда я это делаю, я получаю эту ошибку: для (i в Diatosdef [: 1]) { Ошибка: inesperado ':' in "for (i in Diatosdef [:" При попытке изменить синтаксис U получите это: for (i в Diatosdef [1]) { + if (Diatosdef [i: 1] == Diatosdef [i: 2]) + Diatosdef [i: 1] = Diatosdef [i: 3] +} Ошибка в Ops. data.frame (Diatosdef [i: 1], Diatosdef [i: 2]): '==' определяется только для кадров с одинаковым размером Además: Предупреждающие сообщения: 1: В i: 1: числовое выражение имеет 948 элементы: только первый использованный 2: In i: 2: числовое выражение имеет 948 элементов: только первый использованный – user2963185

+0

Возможно, вы можете попробовать заменить ':' на ','. Извините, но теперь у меня нет Rstudio, поэтому я могу Не пытайтесь :( –

+0

Thank s Даниэле, но я все еще получаю сообщение об ошибке: Ошибка в i: 1: Argumento NA/NaN Además: Предупреждающее сообщение: В '[.data.frame' (Diatomcodes, i: 1): NAs invcidos por coerción – user2963185

0
fun <- function(x, mat){ 
    if(x %in% mat[,2]) mat[which(mat[,2]==x), 3] 
    else x 
} 

Diatosdef[,1] <- sapply(Diatosdef[,1], fun, mat = Diatosdef) 
+0

Thanks Jim ! Это выглядит многообещающе! Проблема состоит в том, что столбцы имеют различное количество наблюдений (столбцы 1 = коэффициент w/948 уровней, столбец 2 = коэффициент w/89 уровней, столбец 3 = коэффициент w/89 уровней), поскольку не все имена видов в столбце 1 нуждаются для замены. Таким образом, при применении вашей функции я получаю: Ошибка в Ops.factor (Diatomcodes [, 2], x): уровни уровней факторов различны – user2963185

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