Filtruj w wierszach wszystkich kolumn z określonymi warunkami
Wciąż uczę się R, mam ten zestaw danych , ma 5 kolumn, pierwsza kolumna to tracking_id, następne cztery kolumny mają wartości czterech grup.
Najpierw chcę filtrować wiersze, które mają wartości równe lub większe od 1, a następnie chcę filtrować wiersze na podstawie porównania ostatnich trzech kolumn („CD44hi_CD69low_rep”, „CD44hi_CD69hi_CD103low_rep”, „CD44hi_CD69hi_CD103hi_rep”), które są 8 razy wyższe lub 4 razy mniej w porównaniu z kolumną („CD44low_rep”).
Wynik powinien mieć 5 kolumn z wartościami równymi lub większymi od 1, które są 8-krotnie wyższe lub 4-krotnie mniejsze z trzech ostatnich kolumn w porównaniu z drugą kolumną.
Powinienem dostać coś takiego:

Aby odfiltrować wiersze równe lub większe niż 1, próbowałem tego:
df1 %>% select_if(is.numeric) %>% filter_all(all_vars(. >= 1))
Następnie, aby odfiltrować 8 razy więcej lub 4 razy mniej, próbowałem (dzięki @akrun):
nm1 <- c("CD44hi_CD69low_rep", "CD44hi_CD69hi_CD103low_rep",
"CD44hi_CD69hi_CD103hi_rep")
i1 <- (rowSums(df1[nm1] >= (df1$CD44low_rep * 8)) == 3) & (rowSums(df1[nm1] <= (df1$CD44low_rep * 4)) == 3)
Jednak nie otrzymuję żadnego wkładu.
Wykonuję następujące kroki:
Analysis and graphic display of RNA-Seq data. A total of 9,085 genes for which
the maximum fragments per kilobase of exon per million mapped reads value in all
samples was ≥1.0 were subjected to further analyses. A principal component analysis
was performed using R (https://www.r-project.org/). Clustering was performed using
APCluster (an R Package for Affinity Propagation Clustering). The transcriptional
signatures of CD44hiCD69lo, CD44hiCD69hiCD103lo and CD44hiCD69hiCD103hi CD4+
T cells were defined with genes for which the expression was eightfold higher or
fourfold lower than that in CD44loCD69lo CD4+ T cells.
For the visualization of the co-regulation network, the 500 genes in the CD44hi
CD4+ T cell groups that showed the greatest variation compared with the naive
(CD44loCD69lo) CD4+ T cell group were subjected to further analyses. The first-
neighbor genes were determined using the following two criteria: (1) a correlation
of >0.8; and (2) a ratio of norm of 0.8–1.25. The network graph of 483 genes was
visualized using Cytoscape (http://www.cytoscape.org/).
Identyfikatory, które mnie interesują to:
values <- c('S100a10', 'Esm1', 'Itgb1', 'Anxa2', 'Hist1h1b',
'Il2rb', 'Lgals1', 'Mki67', 'Rora', 'S100a4',
'S100a6', 'Adam8', 'Areg', 'Bcl2l1', 'Calca',
'Capg', 'Ccr2', 'Cd44', 'Csda', 'Ehd1',
'Id2', 'Il10', 'Il1rl1', 'Il2ra', 'Lmna',
'Maf', 'Penk', 'Podnl1', 'Tiam1', 'Vim',
'Ern1', 'Furin', 'Ifng', 'Igfbp7', 'Il13',
'Il4', 'Il5', 'Nrp1', 'Ptprs', 'Rbpj',
'Spry1', 'Tnfsf11', 'Vdr', 'Xcl1', 'Bmpr2',
'Csf1', 'Dst', 'Foxp3', 'Itgav', 'Itgb8',
'Lamc1', 'Myo1e', 'Pmaip1', 'Prdm1', 'Ptpn5',
'Ramp1', 'Sdc4')
Po zastosowaniu @RonakShah (dziękuję!) Dostaję tylko 21 zamiast 57:
library(dplyr)
df09 <- read.csv('https://raw.githubusercontent.com/learnseq/learning/main/dfpilot.csv')
filtertrial <- df09 %>%
#Keep rows where all the values are greater than 1
filter(across(where(is.numeric), ~. >= 1)) %>%
#Rows where any value is higher than 8 times CD44low_rep
#Or 4 times less than CD44low_rep
filter(Reduce(`|`, across(CD44hi_CD69low_rep:CD44hi_CD69hi_CD103hi_rep,
~. >= CD44low_rep*8 | . <= CD44low_rep/4)))
values <- c('S100a10', 'Esm1', 'Itgb1', 'Anxa2', 'Hist1h1b',
'Il2rb', 'Lgals1', 'Mki67', 'Rora', 'S100a4',
'S100a6', 'Adam8', 'Areg', 'Bcl2l1', 'Calca',
'Capg', 'Ccr2', 'Cd44', 'Csda', 'Ehd1',
'Id2', 'Il10', 'Il1rl1', 'Il2ra', 'Lmna',
'Maf', 'Penk', 'Podnl1', 'Tiam1', 'Vim',
'Ern1', 'Furin', 'Ifng', 'Igfbp7', 'Il13',
'Il4', 'Il5', 'Nrp1', 'Ptprs', 'Rbpj',
'Spry1', 'Tnfsf11', 'Vdr', 'Xcl1', 'Bmpr2',
'Csf1', 'Dst', 'Foxp3', 'Itgav', 'Itgb8',
'Lamc1', 'Myo1e', 'Pmaip1', 'Prdm1', 'Ptpn5',
'Ramp1', 'Sdc4')
#Make sure the sorting won't change by using match function and reverse it to get the right order as
#shown in the original plot.
dfgll <- filtertrial %>% slice(match(rev(values), tracking_id))
dfgll
Jak to osiągnąć?
Odpowiedzi
Możesz spróbować następujących rzeczy:
library(dplyr)
df <- read.csv('https://raw.githubusercontent.com/learnseq/learning/main/dfpilot.csv')
df %>%
#Keep rows where all the values are greater than 1
filter(across(where(is.numeric), ~. > 1)) %>%
#Rows where any value is higher than 8 times CD44low_rep
#Or 4 times less than CD44low_rep
filter(Reduce(`|`, across(CD44hi_CD69low_rep:CD44hi_CD69hi_CD103hi_rep,
~. > CD44low_rep*8 | . < CD44low_rep/4))) -> result
head(result)
# tracking_id CD44low_rep CD44hi_CD69low_rep CD44hi_CD69hi_CD103low_rep
#1 42624 1.91 6.68 17.50
#2 A930005H10Rik 9.41 4.63 1.48
#3 Actn1 42.01 21.77 1.71
#4 Adora2a 1.31 7.05 15.51
#5 Ahnak 12.09 152.43 362.87
#6 Als2cl 11.17 1.98 1.01
# CD44hi_CD69hi_CD103hi_rep
#1 22.51
#2 1.55
#3 1.22
#4 13.31
#5 299.07
#6 1.26