특정 조건이있는 모든 열의 행에서 필터링

Nov 27 2020

저는 여전히 R을 배우고 있습니다.이 데이터 셋 이 있고 5 개의 열이 있고 첫 번째 열은 tracking_id이고 다음 4 개 열에는 4 개의 그룹 값이 있습니다.

먼저 값이 1보다 크거나 같은 행을 필터링 한 다음 마지막 세 열 ( "CD44hi_CD69low_rep", "CD44hi_CD69hi_CD103low_rep", "CD44hi_CD69hi_CD103hi_rep")이 8 배 더 높거나 4 인 비교를 기반으로 행을 필터링하려고합니다. 열 ( "CD44low_rep")에 비해 더 낮게 접 힙니다 .

출력에는 5 개의 열이 있어야하며 1보다 크거나 같은 값은 두 번째 열에 비해 마지막 세 열의 8 배 더 높거나 4 배 더 적어야합니다.

나는 다음과 같은 것을 얻어야한다.

1보다 크거나 같은 행을 필터링하기 위해 다음을 시도했습니다.

df1 %>% select_if(is.numeric) %>%  filter_all(all_vars(. >= 1))

그런 다음 8 배 높이 또는 4 배 적게 필터링하기 위해 시도했습니다 (@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)

그러나 입력이 없습니다.

다음 단계를 따르고 있습니다.

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/).

내가 관심있는 ID는 다음과 같습니다.

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')



@RonakShah (감사합니다!)를 적용한 후 57 대신 21 개만 얻습니다.

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

이것을 달성하는 방법?

답변

1 RonakShah Nov 28 2020 at 07:39

다음을 시도 할 수 있습니다.

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