Дублирование строк на основе нескольких условий в r - PullRequest
0 голосов
/ 06 марта 2020

Ниже приведен пример того, как выглядят мои данные:

    pid    time mut  percent dat
1   1004-A  W1  NV   1.02    V600E
2   1004-A  W1  NV   0.51    E17K
3   1004-A  W1  NV   0.19    R175C
4   1004-A  W1  NV   0.10    S752F
5   1004-A  W3  NV   1.25    E17K
6   1004-A  W3  NV   0.79    V600E
7   1004-B  W1  NV   0.68    2V3290D
8   1004-B  W1  NV   0.20    CAH1047R
9   1004-B  W3  NV   0.49    2V3290D
10  1004-B  W3  noNV 0.06    TP53
11  1004-C  W1  NV   11.60   CAE545K
12  1004-C  W1  NV   1.93    TERT
13  1004-D  W1  NV   20.61   CAN345K
14  1004-D  W1  NV   0.19    3M35
15  1004-C  W1  NV   11.60   CAE545K
16  1004-C  W1  NV   1.93    TERT
17  1004-D  W1  NV   20.61   CAN345K
18  1004-D  W1  NV   0.19    3M35
19  3005-A  W23 NV   2.82    139K
20  3005-A  W23 NV   2.79    R181C
21  3005-A  W23 NV   1.93    L536H
22  3005-A  W23 NV   0.26    D538G
23  3005-A  W23 noNV 1.61    3F392fs
24  3005-A  W1  noNV 0.07    3F392fs
25  3005-A  W1  noNV 0.04    1V247fs
26  3005-B  W8  NV   0.47    R282W
27  3005-B  W8  NV   0.28    CAH1047R
28  3005-B  W1  NV   24.89   CAH1047R
29  3005-B  W1  NV   17.63   R282W
30  3001-A  W3  NV   0.55    R130Q
31  3001-B  W1  noNV 0.09    1905fs
34  3005-A  W23 NV   2.82    139K
35  3005-A  W23 NV   2.79    R181C
36  3005-A  W23 NV   1.93    L536H
37  3005-A  W23 NV   0.26    D538G
38  3005-A  W23 noNV 1.61    3F392fs
39  3005-A  W1  noNV 0.07    3F392fs
40  3005-A  W1  noNV 0.04    1V247fs
41  5001-A  W1  NV   0.10    Q947*
42  5001-A  W1  noNV 13.32   E171fs
43  5001-A  W3  NV   0.17    D400N
44  5001-A  W3  noNV 13.24   E171fs
45  5001-B  W1  NV   0.13    I200S
46  5001-B  W3  NV   0.24    TP53
47  5001-B  W3  NV   0.23    I200S
48  5001-B  W41 NV   0.95    R548C
49  5001-B  W41 NV   0.56    Q947*
50  5001-B  W41 NV   0.07    D538G
51  5001-B  W41 NV   0.04    Y537S
52  5001-B  W41 noNV 0.23    TK11
53  5001-B  W41 noNV 0.13    E542_L544del

Я хочу продублировать строки, в которых совпадает pid (так что group_by pid) и dat не дублируется, также измените время на уровень, который не соответствует там и проценты до 0.

Мой вывод должен выглядеть следующим образом

    pid    time mut  percent dat
1   1004-A  W1  NV   1.02    V600E
2   1004-A  W1  NV   0.51    E17K
3   1004-A  W1  NV   0.19    R175C
4   1004-A  W1  NV   0.10    S752F
5   1004-A  W3  NV   1.25    E17K
6   1004-A  W3  NV   0.79    V600E
7   1004-A  W3  NV   0.00    R175C
8   1004-A  W3  NV   0.00    S752F
9   1004-B  W1  NV   0.68    2V3290D
10  1004-B  W1  NV   0.20    CAH1047R
11  1004-B  W1  noNV 0.00    TP53
12  1004-B  W3  NV   0.49    2V3290D
13  1004-B  W3  NV   0.00    CAH1047R
14  1004-B  W3  noNV 0.06    TP53

Я пытался использовать for для l oop с операторами if, но он пропускает строки, которые не нужны должен быть продублирован. Ниже приведен тестовый код, который я пытался

testID <- unique(datatest$pid)
for (i in testID) {
  test5 <- rbind(datatest,
        datatest %>%
        filter(datatest$dat == datatest$dat[!(duplicated(datatest$dat)|duplicated(datatest$dat, 
        fromLast=TRUE))]) %>%
        mutate(datatest$dat = datatest$dat[!(duplicated(datatest$dat)|duplicated(datatest$dat, 
        fromLast=TRUE))],
        datatest$time = datatest$time[datatest$dat != unique(datatest$dat)],
        Percentage = 0))
}

1 Ответ

0 голосов
/ 06 марта 2020

Мы можем сделать complete после группировки по 'pid'

library(dplyr)
library(tidyr)
datatest %>%
     filter(time %in% c("W1", "W2", "W3")) %>%
     group_by(pid) %>% 
     complete(time, nesting(dat, mut), fill = list(percent = 0))  %>%
     ungroup
# A tibble: 18 x 5
#   pid    time  dat      mut   percent
#   <chr>  <chr> <chr>    <chr>   <dbl>
# 1 1004-A W1    E17K     NV       0.51
# 2 1004-A W1    R175C    NV       0.19
# 3 1004-A W1    S752F    NV       0.1 
# 4 1004-A W1    V600E    NV       1.02
# 5 1004-A W3    E17K     NV       1.25
# 6 1004-A W3    R175C    NV       0   
# 7 1004-A W3    S752F    NV       0   
# 8 1004-A W3    V600E    NV       0.79
# 9 1004-B W1    2V3290D  NV       0.68
#10 1004-B W1    CAH1047R NV       0.2 
#11 1004-B W1    TP53     noNV     0   
#12 1004-B W3    2V3290D  NV       0.49
#13 1004-B W3    CAH1047R NV       0   
#14 1004-B W3    TP53     noNV     0.06
#15 1004-C W1    CAE545K  NV      11.6 
#16 1004-C W1    TERT     NV       1.93
#17 1004-D W1    3M35     NV       0.19
#18 1004-D W1    CAN345K  NV      20.6 

Для обновленного набора данных

out <- datatest2 %>% 
           filter(time %in% c("W1", "W2", "W3")) %>%
           group_by(pid) %>% 
           complete(time, nesting(dat, mut), fill = list(percent = 0))  %>%
         ungroup %>% 
         as.data.frame

out %>% 
   filter(pid %in% head(unique(pid), 2))
#      pid time      dat  mut percent
#1  1004-A   W1     E17K   NV    0.51
#2  1004-A   W1    R175C   NV    0.19
#3  1004-A   W1    S752F   NV    0.10
#4  1004-A   W1    V600E   NV    1.02
#5  1004-A   W3     E17K   NV    1.25
#6  1004-A   W3    R175C   NV    0.00
#7  1004-A   W3    S752F   NV    0.00
#8  1004-A   W3    V600E   NV    0.79
#9  1004-B   W1  2V3290D   NV    0.68
#10 1004-B   W1 CAH1047R   NV    0.20
#11 1004-B   W1     TP53 noNV    0.00
#12 1004-B   W3  2V3290D   NV    0.49
#13 1004-B   W3 CAH1047R   NV    0.00
#14 1004-B   W3     TP53 noNV    0.06

data

datatest <- structure(list(pid = c("1004-A", "1004-A", "1004-A", "1004-A", 
"1004-A", "1004-A", "1004-B", "1004-B", "1004-B", "1004-B", "1004-C", 
"1004-C", "1004-D", "1004-D"), time = c("W1", "W1", "W1", "W1", 
"W3", "W3", "W1", "W1", "W3", "W3", "W1", "W1", "W1", "W1"), 
    mut = c("NV", "NV", "NV", "NV", "NV", "NV", "NV", "NV", "NV", 
    "noNV", "NV", "NV", "NV", "NV"), percent = c(1.02, 0.51, 
    0.19, 0.1, 1.25, 0.79, 0.68, 0.2, 0.49, 0.06, 11.6, 1.93, 
    20.61, 0.19), dat = c("V600E", "E17K", "R175C", "S752F", 
    "E17K", "V600E", "2V3290D", "CAH1047R", "2V3290D", "TP53", 
    "CAE545K", "TERT", "CAN345K", "3M35")), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", 
"14"))




datatest2 <- structure(list(pid = c("1004-A", "1004-A", "1004-A", "1004-A", 
"1004-A", "1004-A", "1004-B", "1004-B", "1004-B", "1004-B", "1004-C", 
"1004-C", "1004-D", "1004-D", "1004-C", "1004-C", "1004-D", "1004-D", 
"3005-A", "3005-A", "3005-A", "3005-A", "3005-A", "3005-A", "3005-A", 
"3005-B", "3005-B", "3005-B", "3005-B", "3001-A", "3001-B", "3005-A", 
"3005-A", "3005-A", "3005-A", "3005-A", "3005-A", "3005-A", "5001-A", 
"5001-A", "5001-A", "5001-A", "5001-B", "5001-B", "5001-B", "5001-B", 
"5001-B", "5001-B", "5001-B", "5001-B", "5001-B"), time = c("W1", 
"W1", "W1", "W1", "W3", "W3", "W1", "W1", "W3", "W3", "W1", "W1", 
"W1", "W1", "W1", "W1", "W1", "W1", "W23", "W23", "W23", "W23", 
"W23", "W1", "W1", "W8", "W8", "W1", "W1", "W3", "W1", "W23", 
"W23", "W23", "W23", "W23", "W1", "W1", "W1", "W1", "W3", "W3", 
"W1", "W3", "W3", "W41", "W41", "W41", "W41", "W41", "W41"), 
    mut = c("NV", "NV", "NV", "NV", "NV", "NV", "NV", "NV", "NV", 
    "noNV", "NV", "NV", "NV", "NV", "NV", "NV", "NV", "NV", "NV", 
    "NV", "NV", "NV", "noNV", "noNV", "noNV", "NV", "NV", "NV", 
    "NV", "NV", "noNV", "NV", "NV", "NV", "NV", "noNV", "noNV", 
    "noNV", "NV", "noNV", "NV", "noNV", "NV", "NV", "NV", "NV", 
    "NV", "NV", "NV", "noNV", "noNV"), percent = c(1.02, 0.51, 
    0.19, 0.1, 1.25, 0.79, 0.68, 0.2, 0.49, 0.06, 11.6, 1.93, 
    20.61, 0.19, 11.6, 1.93, 20.61, 0.19, 2.82, 2.79, 1.93, 0.26, 
    1.61, 0.07, 0.04, 0.47, 0.28, 24.89, 17.63, 0.55, 0.09, 2.82, 
    2.79, 1.93, 0.26, 1.61, 0.07, 0.04, 0.1, 13.32, 0.17, 13.24, 
    0.13, 0.24, 0.23, 0.95, 0.56, 0.07, 0.04, 0.23, 0.13), dat = c("V600E", 
    "E17K", "R175C", "S752F", "E17K", "V600E", "2V3290D", "CAH1047R", 
    "2V3290D", "TP53", "CAE545K", "TERT", "CAN345K", "3M35", 
    "CAE545K", "TERT", "CAN345K", "3M35", "139K", "R181C", "L536H", 
    "D538G", "3F392fs", "3F392fs", "1V247fs", "R282W", "CAH1047R", 
    "CAH1047R", "R282W", "R130Q", "1905fs", "139K", "R181C", 
    "L536H", "D538G", "3F392fs", "3F392fs", "1V247fs", "Q947*", 
    "E171fs", "D400N", "E171fs", "I200S", "TP53", "I200S", "R548C", 
    "Q947*", "D538G", "Y537S", "TK11", "E542_L544del")), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", 
"14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", 
"25", "26", "27", "28", "29", "30", "31", "34", "35", "36", "37", 
"38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", 
"49", "50", "51", "52", "53"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...