我的表的一部分如下所示:
X | 是 | 渠道 | 出色地 |
---|---|---|---|
123 | 123 | 1 | B3 |
123 | 123 | 2 | B3 |
123 | 123 | 1 | B4 |
123 | 123 | 2 | B4 |
123 | 123 | 1 | B5 |
123 | 123 | 2 | B5 |
123 | 123 | 3 | B5 |
123 | 123 | 1 | B6 |
123 | 123 | 2 | B6 |
123 | 123 | 3 | B6 |
我想做的是過濾掉
- 通道號 2 用于只有 2 個通道的井
- 只有 3 個頻道的 3 號頻道
例如,對于 B3 和 B4,必須移除通道 2,對于 B5 和 B6,必須移除通道 3。
太感謝了!
uj5u.com熱心網友回復:
這是一個使用 的選項tidyverse
,我們在其中創建一個新的幫助列來計算不同通道的數量(以防重復)。然后,我們可以在一個新列中指定這 2 個條件,這將用于filter
取出所需的行。然后,我們可以只選擇原始列(即select(names(df))
)。
library(tidyverse)
df %>%
group_by(Well) %>%
mutate(n = n_distinct(Channel),
remove = case_when(n == 2 & Channel == 2 ~ TRUE,
n == 3 & Channel == 3 ~ TRUE,
TRUE ~ FALSE)) %>%
ungroup %>%
filter(!remove) %>%
select(names(df))
輸出
X Y Channel Well
<int> <int> <int> <chr>
1 123 123 1 B3
2 123 123 1 B4
3 123 123 1 B5
4 123 123 2 B5
5 123 123 1 B6
6 123 123 2 B6
或者可以更短的寫成:
df %>%
group_by(Well) %>%
filter(!(n_distinct(Channel) == 2 & Channel == 2) &
!(n_distinct(Channel) == 3 & Channel == 3)) %>%
ungroup
或者在基礎 R 中,您可以執行以下操作:
agg <- aggregate(data = df, cbind(n = Channel) ~ Well, function(x) n = length(unique(x)))
result <- subset(merge(df, agg, by = "Well", all = TRUE), !(n == 2 & Channel == 2) &
!(n == 3 & Channel == 3), select = -n)
或者,如果您只需要洗掉每個組的最后一行,那么您可以這樣做:
df %>%
group_by(Well) %>%
slice(-n())
資料
df <- structure(list(X = c(123L, 123L, 123L, 123L, 123L, 123L, 123L,
123L, 123L, 123L), Y = c(123L, 123L, 123L, 123L, 123L, 123L,
123L, 123L, 123L, 123L), Channel = c(1L, 2L, 1L, 2L, 1L, 2L,
3L, 1L, 2L, 3L), Well = c("B3", "B3", "B4", "B4", "B5", "B5",
"B5", "B6", "B6", "B6")), class = "data.frame", row.names = c(NA,
-10L))
uj5u.com熱心網友回復:
如果規則是洗掉具有N個通道的 aWell
中的第N個通道,那么一般方法是
library(dplyr)
df %>%
group_by(Well) %>%
filter(Channel != n_distinct(Channel)) %>%
ungroup()
# # A tibble: 6 × 4
# X Y Channel Well
# <int> <int> <int> <chr>
# 1 123 123 1 B3
# 2 123 123 1 B4
# 3 123 123 1 B5
# 4 123 123 2 B5
# 5 123 123 1 B6
# 6 123 123 2 B6
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/491233.html