Filterzeilen, die entweder oder bestimmte Falten haben
Ich lerne immer noch R, ich habe diesen Datensatz , er hat 5 Spalten, die erste Spalte ist tracking_id, die nächsten vier Spalten haben Werte von vier Gruppen.
Ich möchte Zeilen filtern, nachdem ich die letzten drei Spalten ("CD44hi_CD69low_rep", "CD44hi_CD69hi_CD103low_rep", "CD44hi_CD69hi_CD103hi_rep") verglichen habe , die 8-fach höher oder 4-fach niedriger sind als die Spalte ("CD44low_rep").
Wie erreicht man das?
Antworten
Wir multiplizieren die Spalte 'CD44low_rep' mit 8 und 4, vergleichen sie dann mit den interessierenden Spalten unter Verwendung von >=
und erhalten <=
jeweils die zeilenweise Summe der WAHREN Werte mit rowSums
, prüfen, ob sie gleich 3 ist (dh die Anzahl der verglichenen Spalten), verwenden &
um einen einzelnen logischen Vektor aus beiden Vergleichen zurückzugeben und damit die Zeilen zu unterteilen
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
Oder dplyr
wir verwenden denselben Ausdruck, indem wir die interessierenden Spalten mit durchlaufen across
(standardmäßig wird nach all
Spalten gesucht).
library(dplyr)
df1 %>%
filter(across(contains('hi'), ~ (. >= (CD44low_rep * 8)) &
(. <= (CD44low_rep * 4))))
-Ausgabe
# 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