2016-10-11 10 views
2

Я хочу заменить Sire на новый Id, если Dam НЕ 0. А после этого добавьте новую строку каждый раз с новыми Id и Sex.Заменить значение и добавить строки с помощью цикла if/for

Например, мне нужно заменить 0 в первой строке как s1073 и добавить новую строку в данные как 1 s1073 0 0 2. Аналогично, если Dam равно 0, а Sir НЕ 0, то добавление новой строки в набор данных, например в строке 7, необходимо повторно использовать Dam 0 с d900 и добавить новую строку в фрейме данных как 1 d900 0 0 2.

Может кто-нибудь, пожалуйста, помогите мне разобраться?

FID ID Sire Dam Sex 
1 1832 0 1073 1 
1 1833 1201 1251 2 
1 1834 15 560 1 
1 1835 1598 1583 1 
1 1836 0 13 1 
1 1837 1107 562 1 
1 1838 900 0 1 
1 1839 900 571 2 
1 1840 900 0 1 
1 1841 0 415 1 
1 1842 0 0 2 
1 1843 1201 303 2 
1 1844 0 0 1 
1 1845 1107 557 2 
1 1846 15 749 2 

ответ

2

Я предполагаю, что это формат plink FAM, и некоторые люди не хватает отца или мать, и мы хотим, чтобы добавить недостающую родителя для людей, которые имеют по крайней мере один из родителей, если оба отсутствуют, то сделать не добавляйте родителей.

# dummy fam data with missing parents 
df1 <- read.table(text = "FID IID Father Mother Sex 
1 1 0 2 1 
        1 2 0 0 2 
        1 3 0 2 1 
        1 4 0 2 2 
        2 1 3 0 1 
        2 2 3 0 2 
        2 3 0 0 1 
        3 1 0 0 1 
        4 1 0 0 1 
        4 2 0 0 2 
        4 3 1 2 2 
        4 4 1 2 2 
        ", header = TRUE, 
        colClasses = "character") 

Примечание, о фиктивных данных:
- FID == 1 отсутствует отец
- FID == 2 отсутствует мать
- FID == 3 представляет собой один человек семьи с нет родителей
- FID == 4 нет отсутствующих родителей

Задача, добавить недостающую отца или матери, только если один из них отсутствует. т. е .: если оба пропавших отца == 0 и Мать == 0, то не добавляйте родителей.

library(dplyr) # using dplyr for explicity of steps. 

# update 0 to IID for missing Father and Mother with suffix f and m 
df1 <- 
    df1 %>% 
    mutate(
    FatherNew = if_else(Father == "0" & Mother != "0", paste0(Mother, "f", IID), Father), 
    MotherNew = if_else(Mother == "0" & Father != "0", paste0(Father, "m", IID), Mother)) 

# add missing Fathers 
missingFather <- df1 %>% 
    filter(
    FatherNew != "0" & 
     MotherNew != "0" & 
     !FatherNew %in% df1$IID) %>% 
    transmute(
    FID = FID, 
    IID = FatherNew, 
    Father = "0", 
    Mother = "0", 
    Sex = "1") %>% 
    unique 


# add missing Mothers 
missingMother <- df1 %>% 
    filter(
    FatherNew != "0" & 
     MotherNew != "0" & 
     !MotherNew %in% df1$IID) %>% 
    transmute(
    FID = FID, 
    IID = MotherNew, 
    Father = "0", 
    Mother = "0", 
    Sex = "2") %>% 
    unique 

# update new Father/Mother IDs 
res <- df1 %>% 
    transmute(
    FID = FID, 
    IID = IID, 
    Father = FatherNew, 
    Mother = MotherNew, 
    Sex = Sex) 

# add missing Fathers/Mothers as new rows, and sort 
res <- rbind(
    res, 
    missingFather, 
    missingMother) %>% 
    arrange(FID, IID) 

Результат, проверьте выход

res 
# FID IID Father Mother Sex 
# 1 1 1 2f1  2 1 
# 2 1 2  0  0 2 
# 3 1 2f1  0  0 1 
# 4 1 2f3  0  0 1 
# 5 1 2f4  0  0 1 
# 6 1 3 2f3  2 1 
# 7 1 4 2f4  2 2 
# 8 2 1  3 3m1 1 
# 9 2 2  3 3m2 2 
# 10 2 3  0  0 1 
# 11 2 3m1  0  0 2 
# 12 2 3m2  0  0 2 
# 13 3 1  0  0 1 
# 14 4 1  0  0 1 
# 15 4 2  0  0 2 
# 16 4 3  1  2 2 
# 17 4 4  1  2 2 
+0

Это замечательно. Моя 90% проблема решена. Остается еще один вопрос - некоторые из отцов или матерей приходят больше, чем 1, и мне нужен отдельный идентификатор для них. Например, в приведенном выше примере отец «3» приходит дважды, поэтому мне нужны мамы как 3m1, 3m2 ..... и в том же fasion IID также должны быть скорректированы ... Вы знаете, что я могу это сделать? – user2808642

+0

@ user2808642, но тогда мы говорим, что братья и сестры от одного и того же Отца (3) и от двух разных матерей (3m1 и 3m2)? – zx8754

+0

@ user2808642 Было бы неплохо, если бы вы могли скопировать мои фиктивные данные на ваш пост и добавить ожидаемый результат. – zx8754

-1

Я думаю, что этот ответ был очень полезен для меня, чтобы выяснить, не хватает совсем весной. Благодаря!

+1

Пожалуйста, прочитайте [Как принимается ответ?] (Http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work). И удалите этот ответ. – zx8754