2016-10-06 1 views
0

Я ничего не знаю о R, и у меня есть data.frame с 2 столбцами, оба они касаются пола животных, но у одного из них есть некоторые исправления, а у другого не делает.Сочетание 2 столбцов в R, априорирующих один из них

Мой желаемый data.frame будет выглядеть так:

id sex father mother birth.date farm 
    0 1 john ray 05/06/94  1 
    1 1 doug ana 18/02/93  NA 
    2 2 bryan kim 21/03/00  3 

Но я попал в эту data.frame с помощью слияния на 2 других data.frames

id sex.x father mother birth.date sex.y farm 
    0 2 john ray 05/06/94 1  1 
    1 1 doug ana 18/02/93 NA NA 
    2 2 bryan kim 21/03/00 2  3 

data.frame 1 или Животные (имеет неправильный секс для некоторых животных)

id sex father mother birth.date 
    0 2 john ray 05/06/94 
    1 1 doug ana 18/02/93 
    2 2 bryan kim 21/03/00 

data.frame 2 или фермы (имеет правильный пол):

id farm sex 
    0 1 1 
    2 3 2 

Код я использовал: Animals_Farm <- merge(Animals , Farm, by="id", all.x=TRUE)

Мне нужно, чтобы объединить 2 секс колонки в одну, приоритизации sex.y. Как мне это сделать?

+0

Добро пожаловать в R. Проверьте это высокопоставленное Q. http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example. Затем попробуйте указать данные входных данных, каков ваш желаемый результат. – user5249203

+0

Это было бы хорошей задачей для 'coalesce' из пакета dplyr. – aosmith

+1

'секс <- ifelse (! Is.na (sex.y), sex.y, sex.x)' – rawr

ответ

0

Если вы правильно поняли, например, у вас есть ситуация, аналогичная той, что я показываю ниже, в соответствии с примером из функции merge.

> (authors <- data.frame(
     surname = I(c("Tukey", "Venables", "Tierney", "Ripley", "McNeil")), 
     nationality = c("US", "Australia", "US", "UK", "Australia"), 
     deceased = c("yes", rep("no", 3), "yes"))) 

    surname nationality deceased 
1 Tukey   US  yes 
2 Venables Australia  no 
3 Tierney   US  no 
4 Ripley   UK  no 
5 McNeil Australia  yes 

> (books <- data.frame(
     name = I(c("Tukey", "Venables", "Tierney", 
       "Ripley", "Ripley", "McNeil", "R Core")), 
     title = c("Exploratory Data Analysis", 
       "Modern Applied Statistics ...", "LISP-STAT", 
       "Spatial Statistics", "Stochastic Simulation", 
       "Interactive Data Analysis", 
       "An Introduction to R"), 
     deceased = c("yes", rep("no", 6)))) 

     name       title deceased 
1 Tukey  Exploratory Data Analysis  yes 
2 Venables Modern Applied Statistics ...  no 
3 Tierney      LISP-STAT  no 
4 Ripley   Spatial Statistics  no 
5 Ripley   Stochastic Simulation  no 
6 McNeil  Interactive Data Analysis  no 
7 R Core   An Introduction to R  no 

> (m1 <- merge(authors, books, by.x = "surname", by.y = "name")) 

    surname nationality deceased.x       title deceased.y 
1 McNeil Australia  yes  Interactive Data Analysis   no 
2 Ripley   UK   no   Spatial Statistics   no 
3 Ripley   UK   no   Stochastic Simulation   no 
4 Tierney   US   no      LISP-STAT   no 
5 Tukey   US  yes  Exploratory Data Analysis  yes 
6 Venables Australia   no Modern Applied Statistics ...   no 

Где authors может представлять первый dataframe и books ваш второй и deceased может быть значение, которое в обоих dataframe, но только до настоящего времени в одном из них (authors).

Самый простой способ включить только правильное значение deceased - это просто исключить неверный из слияния.

> (m2 <- merge(authors, books[names(books) != "deceased"], 
       by.x = "surname", by.y = "name")) 

    surname nationality deceased       title 
1 McNeil Australia  yes  Interactive Data Analysis 
2 Ripley   UK  no   Spatial Statistics 
3 Ripley   UK  no   Stochastic Simulation 
4 Tierney   US  no      LISP-STAT 
5 Tukey   US  yes  Exploratory Data Analysis 
6 Venables Australia  no Modern Applied Statistics ... 

Строка кода books[names(books) != "deceased"] просто подмножества dataframe books, чтобы удалить deceased колонки, оставляя только правильный deceased столбец из authors в окончательном слиянии.

+0

Проблема в том, что у данных животных больше животных, чем у dataframe Farm, поэтому я не могу просто удалить sex.x –

+0

Вот почему воспроизводимый пример, демонстрирующий проблемы, которые вы пытаетесь преодолеть, важны. В этом случае я бы рекомендовал решение в комментариях ниже вопроса by @rawr – Barker

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