R-код для фильтрации значений в группах - PullRequest
0 голосов
/ 16 апреля 2020

Я столкнулся с проблемой, данные состоят из двух условий, и в них есть две биологические копии и две технические. Теперь я хотел бы сохранить только те строки, в которых есть хотя бы одно значение, отличное от NA, для каждого технического дубликата.

Во-первых, есть небольшая таблица макетов, чтобы лучше описать сам df. Далее, сначала 15 строк исходных данных и, как последний, мой код.

Я уверен, что есть лучший способ сделать это ... ура

Accession   M_bio1_tech1    M_bio1_tech2    M_bio2_tech1    M_bio2_tech2    M_bio3_tech1    M_bio3_tech2    T_bio1_tech1    T_bio1_tech2    T_bio2_tech1    T_bio2_tech2    T_bio3_tech1    T_bio3_tech2
A   NA  1   NA  1   1   1   1   1   1   1   1   1
B   1   1   1   1   1   1   1   1   1   1   1   1
C   1   1   1   1   1   1   1   1   1   1   1   1
D   1   NA  1   1   1   1   1   1   1   1   1   1
E   1   1   1   1   NA  NA  NA  NA  NA  1   1   1
F   1   1   1   1   1   1   1   1   1   1   1   1
G   1   1   1   1   1   1   1   1   1   1   1   1
H   NA  NA  NA  1   1   1   NA  1   NA  1   NA  1
I   1   1   NA  1   1   1   1   1   1   1   1   1





> ATG8[c(1:15),]
# A tibble: 15 x 13
   Accession ATG8_Mock_1_1 ATG8_Mock_1_2 ATG8_Mock_2_1 ATG8_Mock_2_2 ATG8_Mock_3_1 ATG8_Mock_3_2        ATG8_TREAT_1_1
   <chr>             <dbl>         <dbl>         <dbl>         <dbl>         <dbl>         <dbl>              <dbl>
  1 sp          11000000000   14000000000   16000000000   13000000000   15000000000   16000000000    30000000000
  2 AT3G0984~            NA       3400000            NA            NA            NA       1500000        4300000
  3 AT5G0334~            NA            NA            NA            NA            NA            NA             NA
  4 AT3G5323~            NA            NA            NA            NA            NA            NA        6300000
  5 sp          13000000000   32000000000   22000000000   35000000000   19000000000   31000000000    17000000000
  6 AT4G2198~    7100000000   17000000000   11000000000   17000000000   14000000000   22000000000    26000000000
  7 sp            290000000     820000000     660000000     950000000     280000000     360000000      420000000
  8 AT1G0901~     390000000     780000000     890000000     890000000     270000000     290000000     1300000000
 9 ATCG0049~    1100000000    2400000000      35000000      30000000     790000000     870000000      320000000
 10 AT3G0853~      11000000      38000000      54000000      67000000      38000000      37000000      130000000
 11 AT3G1113~      17000000      53000000      70000000      73000000      44000000      51000000      140000000
 12 AT3G4431~      45000000      99000000       5000000       9900000       8000000      23000000       12000000
  13 AT2G4711~            NA     170000000            NA            NA            NA            NA      960000000
  14 AT1G5506~            NA            NA            NA            NA            NA            NA             NA
  15 AT5G0250~      27000000      80000000      23000000      31000000      52000000      74000000       90000000
 # ... with 5 more variables: ATG8_TREAT_1_2 <dbl>, ATG8_TREAT_2_1 <dbl>, ATG8_TREAT_2_2 <dbl>,      ATG8_TREAT_3_1 <dbl>,
 #   ATG8_TREAT_3_2 <dbl>
 > 


 ATG8_long<-melt(data = ATG8, id.vars = c("Accession"), measure.vars = c("ATG8_Mock_1_1",        "ATG8_Mock_1_2", "ATG8_Mock_2_1", "ATG8_Mock_2_2", "ATG8_Mock_3_1", 
"ATG8_Mock_3_2", "ATG8_TREAT_1_1", "ATG8_TREAT_1_2", "ATG8_TREAT_2_1", "ATG8_TREAT_2_2",     "ATG8_TREAT_3_1", "ATG8_TREAT_3_2" ))


    ATG8_long<-ATG8_long %>% drop_na(Accession)


 ATG8_long$na_count <- apply(ATG8_long, 1, function(x) sum(is.na(x)))
 ATG8_long %>% mutate_if(is.factor, as.character) -> ATG8_long




 IDs<-unique(ATG8_long$Accession)
 result<-data.frame()
 for (i in 1:length(IDs)){
 temp <- ATG8_long[ATG8_long$Accession==IDs[i],]
 M1_1<-temp[which(temp$variable == "ATG8_Mock_1_1"),]
 M1_2<-temp[which(temp$variable == "ATG8_Mock_1_2"),]          
 M12<-rbind(M1_1,M1_2)
 M12<-M12[!(is.na(M1_1$value)) | !(is.na(M1_2$value)),]

 M2_1<-temp[which(temp$variable == "ATG8_Mock_2_1"),]
M2_2<-temp[which(temp$variable == "ATG8_Mock_2_2"),]          
M22<-rbind(M2_1,M2_2)
M22<-M22[!(is.na(M2_1$value)) | !(is.na(M2_2$value)),]

 M3_1<-temp[which(temp$variable == "ATG8_Mock_3_1"),]
M3_2<-temp[which(temp$variable == "ATG8_Mock_3_2"),]          
 M33<-rbind(M3_1,M3_2)
 M33<-M33[!(is.na(M3_1$value)) | !(is.na(M3_2$value)),]

T1_1<-temp[which(temp$variable == "ATG8_TREAT_1_1"),]
 T1_2<-temp[which(temp$variable == "ATG8_TREAT_1_2"),]          
 T12<-rbind(T1_1,T1_2)
 T12<-T12[!(is.na(T1_1$value)) | !(is.na(T1_2$value)),]

T2_1<-temp[which(temp$variable == "ATG8_TREAT_2_1"),]
 T2_2<-temp[which(temp$variable == "ATG8_TREAT_2_2"),]          
 T22<-rbind(T2_1,T2_2)
 T22<-T22[!(is.na(T2_1$value)) | !(is.na(T2_2$value)),]

 T3_1<-temp[which(temp$variable == "ATG8_TREAT_3_1"),]
T3_2<-temp[which(temp$variable == "ATG8_TREAT_3_2"),]          
T33<-rbind(T3_1,T3_2)
T33<-T33[!(is.na(T3_1$value)) | !(is.na(T3_2$value)),]


 temp<-rbind(M12, M22,M33,T12, T22,T33 )
 result<-rbind(result,temp)
  }

1 Ответ

1 голос
/ 16 апреля 2020

Кажется, что вам просто нужно подсчитать не пропущенные значения в каждом из наборов столбцов, используя is.na() и выбрать строки, которые имеют более 0 не пропущенных значений в каждом наборе:

out <- ATG8[,rowSums(!is.na(ATG8[,2:3]))>0 & 
             rowSums(!is.na(ATG8[,4:5]))>0 & 
             rowSums(!is.na(ATG8[,6:7]))>0 & 
             rowSums(!is.na(ATG8[,8:9]))>0 & 
             rowSums(!is.na(ATG8[,10:11]))>0 & 
             rowSums(!is.na(ATG8[,12:13]))>0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...