menyaring baris yang memiliki salah satu atau lipatan tertentu
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
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 all
kolom)
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