Определите строки, соответствующие значениям в df $ columnA, которые встречаются дважды, а затем присвойте значение в df $ columnB - PullRequest
0 голосов
/ 22 мая 2018

У меня есть датафрейм pedigree, который выглядит следующим образом:

FamilyID SampleID           MotherID            FatherID            Sex        
F1961    F1961-1_8005116592 F1961-3_8005116421  F1961-2_8005116603  1
F1961    F1961-2_8005116603 0                   0                   2   
F1961    F1961-3_8005116421 0                   0                   1   
0450     F350_8005441283    0                   0                   1   
0006     F355_8005441353    0                   0                   1   
0189     F359_8005441284    0                   0                   1   
0189     F359_8005441285    0                   0                   2
.
.
.

Некоторые FamilyIDs (например, 0189) появляются дважды, и они соответствуют парам братьев и сестер, чьи данные родителейне был записан.

Мне нужно добавить «фиктивный папа / мать-папа», который используется совместно для этих пар братьев и сестер, для последующего анализа.

Я хотел бы конкретно указать те образцы, чьи FamilyID появляется два раза и присваивает им общее значение motherID / fatherID, поэтому приведенный выше пример будет выглядеть следующим образом:

Желаемый результат:

FamilyID SampleID           MotherID            FatherID            Sex        
F1961    F1961-1_8005116592 F1961-3_8005116421  F1961-2_8005116603  1
F1961    F1961-2_8005116603 0                   0                   2   
F1961    F1961-3_8005116421 0                   0                   1   
0450     F350_8005441283    0                   0                   1   
0006     F355_8005441353    0                   0                   1   
0189     F359_8005441284    0189_mother         0189_father         1   
0189     F359_8005441285    0189_mother         0189_father         2   
.
.
.

До сих пор я пытался начать с mutate, чтобы добавить столбец, показывающий, сколько раз наблюдается каждый FamilyID, но это не работает:

pedigree %>% 
  mutate(FamilySize = count(Family_ID))

Error in mutate_impl(.data, dots) : Evaluation error: no applicable method for 'groups' applied to an object of class "character".

Большое спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Вы можете использовать dplyr для группировки по FamiliID и обновления столбцов (MotherID / FatherID) для условия n()==2.

Опция # 1 : Получить результат в ожидаемом формате OP

library(dplyr)
df %>% group_by(FamilyID) %>%
  mutate(MotherID = ifelse(n() == 2, paste(FamilyID, "mother", sep= "_"), MotherID)) %>%
  mutate(FatherID = ifelse(n() == 2, paste(FamilyID, "father", sep= "_"), FatherID)) 

# FamilyID SampleID           MotherID           FatherID             Sex
# <chr>    <chr>              <chr>              <chr>              <int>
# 1 F1961    F1961-1_8005116592 F1961-3_8005116421 F1961-2_8005116603     1
# 2 F1961    F1961-2_8005116603 F1961-3_8005116421 F1961-2_8005116603     2
# 3 F1961    F1961-3_8005116421 F1961-3_8005116421 F1961-2_8005116603     1
# 4 0450     F350_8005441283    0                  0                      1
# 5 0006     F355_8005441353    0                  0                      1
# 6 0189     F359_8005441284    0189_mother        0189_father            1
# 7 0189     F359_8005441285    0189_mother        0189_father            2

Опция # 2: Если OP счастлив иметь фиктивные идентификаторыв форме FamilyID_dummy, чем более элегантное решение может быть достигнуто с использованием mutate_at как:

library(dplyr)

df %>% group_by(FamilyID) %>%
  mutate_at(vars(c("MotherID","FatherID")), 
              funs(ifelse(n() == 2, paste(FamilyID, "dummy", sep= "_"), .)))

# # A tibble: 7 x 5
# # Groups: FamilyID [4]
# FamilyID SampleID           MotherID           FatherID             Sex
# <chr>    <chr>              <chr>              <chr>              <int>
# 1 F1961    F1961-1_8005116592 F1961-3_8005116421 F1961-2_8005116603     1
# 2 F1961    F1961-2_8005116603 F1961-3_8005116421 F1961-2_8005116603     2
# 3 F1961    F1961-3_8005116421 F1961-3_8005116421 F1961-2_8005116603     1
# 4 0450     F350_8005441283    0                  0                      1
# 5 0006     F355_8005441353    0                  0                      1
# 6 0189     F359_8005441284    0189_dummy         0189_dummy             1
# 7 0189     F359_8005441285    0189_dummy         0189_dummy             2

Данные:

df <- read.table(text = 
"FamilyID SampleID           MotherID            FatherID            Sex        
F1961    F1961-1_8005116592 F1961-3_8005116421  F1961-2_8005116603  1
F1961    F1961-2_8005116603 0                   0                   2   
F1961    F1961-3_8005116421 0                   0                   1   
0450     F350_8005441283    0                   0                   1   
0006     F355_8005441353    0                   0                   1   
0189     F359_8005441284    0                   0                   1   
0189     F359_8005441285    0                   0                   2",
header = TRUE, stringsAsFactors = FALSE)
0 голосов
/ 22 мая 2018

Чтобы рассчитать размер семьи, мы хотим сгруппировать их по FamilyID, а затем подсчитать строки в каждой группе с помощью n().Затем мы можем использовать mutate с if_else для замены значения MotherID или FatherID, если это необходимо.Фактически, мы можем сохранить здесь таблицу, сгруппированную по FamilyID, потому что все переменные, которые мы используем в нашем выражении mutate (FamilySize, FatherID и MotherID), одинаковы во всей группе.Если бы они не были (например, если бы мы хотели сделать что-то другое, основанное на Sex), то мы бы хотели переключиться на rowwise, чтобы mutate применял функции if_else к каждой строке отдельно по одной, вместо этогоодного векторизованного вычисления.

pedigree %>%
    group_by(FamilyID) %>%
    mutate(FamilySize = n()) %>%
    mutate(MotherID = if_else(FamilySize == 2 & MotherID == 0,
                              paste0(FamilyID, '_mother'),
                              MotherID),
           FatherID = if_else(FamilySize == 2 & FatherID == 0,
                              paste0(FamilyID, '_father'),
                              FatherID))

# A tibble: 7 x 6
  FamilyID SampleID           MotherID           FatherID             Sex FamilySize
  <chr>    <chr>              <chr>              <chr>              <int>      <int>
1 F1961    F1961-1_8005116592 F1961-3_8005116421 F1961-2_8005116603     1          3
2 F1961    F1961-2_8005116603 0                  0                      2          3
3 F1961    F1961-3_8005116421 0                  0                      1          3
4 0450     F350_8005441283    0                  0                      1          1
5 0006     F355_8005441353    0                  0                      1          1
6 0189     F359_8005441284    0189_mother        0189_father            1          2
7 0189     F359_8005441285    0189_mother        0189_father            2          2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...