menyaring baris yang memiliki salah satu atau lipatan tertentu

Nov 28 2020

Saya masih belajar R, saya memiliki kumpulan data ini , memiliki 5 kolom, kolom pertama adalah tracking_id, empat kolom berikutnya memiliki nilai dari empat grup.

Saya ingin memfilter baris setelah membandingkan tiga kolom terakhir ("CD44hi_CD69low_rep", "CD44hi_CD69hi_CD103low_rep", "CD44hi_CD69hi_CD103hi_rep") yang 8 kali lipat lebih tinggi atau 4 kali lipat lebih rendah dibandingkan dengan kolom ("CD44low_rep").

Bagaimana cara mencapai ini?

Jawaban

1 akrun Nov 28 2020 at 05:10

Kami mengalikan kolom 'CD44low_rep' dengan 8 dan 4, lalu membandingkannya dengan kolom yang diinginkan menggunakan >=dan <=masing - masing, dapatkan jumlah deretan nilai BENAR dengan rowSums, periksa apakah sama dengan 3 (yaitu jumlah kolom yang dibandingkan), gunakan &untuk mengembalikan satu vektor logika dari kedua perbandingan, dan menggunakannya untuk membuat subset baris

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)

df1[i1,]
# A tibble: 798 x 5
#   tracking_id   CD44low_rep CD44hi_CD69low_rep CD44hi_CD69hi_CD103low_rep CD44hi_CD69hi_CD103hi_rep
#   <chr>               <dbl>              <dbl>                      <dbl>                     <dbl>
# 1 1600014C23Rik           0                  0                          0                         0
# 2 1600019K03Rik           0                  0                          0                         0
# 3 1700006E09Rik           0                  0                          0                         0
# 4 1700010M22Rik           0                  0                          0                         0
# 5 1700011A15Rik           0                  0                          0                         0
# 6 1700016P04Rik           0                  0                          0                         0
# 7 1700018G05Rik           0                  0                          0                         0
# 8 1700019A02Rik           0                  0                          0                         0
# 9 1700024B18Rik           0                  0                          0                         0
#10 1700024G13Rik           0                  0                          0                         0
# … with 788 more rows

Atau menggunakan dplyr, kami menggunakan ekspresi yang sama dengan mengulang kolom yang diminati dengan across(secara default, ini melakukan pemeriksaan allkolom)

library(dplyr)
df1 %>%
     filter(across(contains('hi'), ~ (. >= (CD44low_rep * 8)) & 
                (. <= (CD44low_rep * 4))))

-keluaran

# A tibble: 798 x 5
#   tracking_id   CD44low_rep CD44hi_CD69low_rep CD44hi_CD69hi_CD103low_rep CD44hi_CD69hi_CD103hi_rep
#   <chr>               <dbl>              <dbl>                      <dbl>                     <dbl>
# 1 1600014C23Rik           0                  0                          0                         0
# 2 1600019K03Rik           0                  0                          0                         0
# 3 1700006E09Rik           0                  0                          0                         0
# 4 1700010M22Rik           0                  0                          0                         0
# 5 1700011A15Rik           0                  0                          0                         0
# 6 1700016P04Rik           0                  0                          0                         0
# 7 1700018G05Rik           0                  0                          0                         0
# 8 1700019A02Rik           0                  0                          0                         0
# 9 1700024B18Rik           0                  0                          0                         0
#10 1700024G13Rik           0                  0                          0                         0
# … with 788 more rows