2015-09-15 3 views
0

У меня есть два набора данных: mydata2 и mydata3Замена клеток

Mydata2: 2 колонки в нем: Destination.DisplayName и Partner.Type

(Partner.Type базируется на Destination.DisplayName)

Mydata3: 2 колонки в нем: Если и тогда

мне нужна строка кода, который проверяет, если Destination.DisplayName равно Если, и если да, то установить partner.type к значению в Тогда

Прямо сейчас это то, что у меня есть

 mydata2$Partner.Type[ mydata2$Destination.DisplayName %in% mydata3$If] = as.character((mydata3$Then[match(mydata2$Destination.DisplayName, mydata3$If)])) 

Кто-нибудь увидеть, что здесь не так?

+2

Добро пожаловать в SO. Прежде всего, вы должны прочитать [здесь] (http://stackoverflow.com/help/how-to-ask) о том, как задать хороший вопрос; хороший вопрос имеет лучшие изменения, которые нужно решить, и вы получите помощь. С другой стороны, чтение [this] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) также хорошо. В нем объясняется, как создать воспроизводимый пример в R. Помогите пользователям помочь вам, предоставив часть ваших данных желаемый результат и то, что вы пробовали до сих пор. – SabDeM

ответ

1

Я предлагаю использовать ifelse функцию:

mydata2$Partner.Type <- ifelse( mydata2$Destination.DisplayName == mydata3$If, 
           mydata3$Then, 
           mydata2$Partner.Type) 

EDIT

Если столбцы не имеют одинаковую длину, то попробуйте sapply

sapply(mydata2$Destination.DisplayName, function(element){ 
    if (element %in% mydata3$If){ 
    return(mydata3$Then[which(element == mydata3$If)]) 
} else { 
return(mydata2$Partner.Type[which(element == mydata2$Destination.DisplayName)]) 
} 
}) -> mydata2$Destination.DisplayName 

EDIT2

Или вы можете использовать dplyr пакет и left_join функция.

library(dplyr) 
mydata2 %>% 
    left_join(mydata3, 
       by = c("Destination.DisplayName" = "If") 
    ) -> joined_mydatas 

ifelse(is.na(joined_mydatas$Then), 
     joined_mydatas$Partner.Type, 
     joined_mydatas$Then) -> mydata2$Partner.Type 
+0

Я считаю, что нам не разрешено использовать «==» в ifelse из-за установки двух столбцов, равных друг другу. Я тоже пробовал команду% in%, и это похоже на то, что многие результаты неверны в столбце Partner.Type –

+1

Вы не писали, что у них разные размеры. Я отредактировал свой вопрос. Попробуй? –

+1

Destination.DisplayName имел в нем тысячи строк, а в столбце If - только 20 записей. Я попытался с помощью sapply, но я получаю сообщение об ошибке: "Ошибка: неожиданный ')' в: " возвращение (mydata2 $ Partner.Type [который (элемент == mydata2 $ Destination.DisplayName)]) })» " –

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