我有一個特定的過濾問題。這是我的示例資料集的樣子:
df <- data.frame(id = c(1,2,3,3,4,5),
cat= c("A","A","A","B","B","B"))
> df
id cat
1 1 A
2 2 A
3 3 A
4 3 B
5 4 B
6 5 B
分組方式id,當cat有多個類別時,我只會過濾 cat A。所以期望的輸出是:
> df.1
id cat
1 1 A
2 2 A
3 3 A
4 4 B
5 5 B
有任何想法嗎?
謝謝!
uj5u.com熱心網友回復:
在本例中,您可以從組中取出第一項。在其他情況下,您可能需要先重新排序arrange。
(使用dplyr)
df %>% group_by(id) %>% summarise(cat = first(cat))
uj5u.com熱心網友回復:
基礎 R:
aggregate(
df$cat,
by = list(id = df$id),
FUN = \(x) {
unx <- unique(x)
if (length(unx) > 1) 'A' else unx
}
)
# id x
# 1 1 A
# 2 2 A
# 3 3 A
# 4 4 B
# 5 5 B
uj5u.com熱心網友回復:
如果 中只有兩個組cat,我們可以使用以下邏輯:
df %>%
group_by(id) %>%
filter(! (n() == 2 & cat == "B"))
# A tibble: 5 x 2
# Groups: id [5]
id cat
<dbl> <chr>
1 1 A
2 2 A
3 3 A
4 4 B
5 5 B
當可能有多個其他字母時
df <- data.frame(id = c(1,2,3,3,4,5,6,6,6,7),
cat= c("A","A","A","B","B","B", "A", "B", "C","D"))
df %>%
group_by(id) %>%
filter(! (n() >= 2 & cat %in% LETTERS[2:26]))
# A tibble: 7 x 2
# Groups: id [7]
id cat
<dbl> <chr>
1 1 A
2 2 A
3 3 A
4 4 B
5 5 B
6 6 A
7 7 D
說明:n()給出當前組的大小。當滿足該條件時,我們過濾掉所有不是“B”的東西。
uj5u.com熱心網友回復:
一種方法dplyr。分組后id,filter每個只有一行id或者cat是“A”。
library(dplyr)
df %>%
group_by(id) %>%
filter(n() == 1 | cat == "A")
輸出
id cat
<dbl> <chr>
1 1 A
2 2 A
3 3 A
4 4 B
5 5 B
此外,如果可以cat在單個 中重復相同的內容id,您可以filter在不同的數量cat為 1 的情況下(如果cat是“A”,則保留):
df %>%
group_by(id) %>%
filter(n_distinct(cat) == 1 | cat == "A")
uj5u.com熱心網友回復:
使用 base R
subset(df, cat == 'A'|id %in% names(which(table(id) == 1)))
id cat
1 1 A
2 2 A
3 3 A
5 4 B
6 5 B
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/340006.html
上一篇:根據字串ID對值求和
