我一直在StackOverflow中查看可能的解决方案一段时间,但我必须请求帮助。
我有一个具有以下结构的数据框:
df <- data.frame(A = c("A", "A", "A", "A", "B", "B", "C", "C", "C", "C", "D"),
B = c("F1", "F2", "F3", "F4", "F2", "F3", "F1", "F2", "F3", "F4",
"F4"))
我想过滤它以仅保留具有完整级别的行,如下所示:
df_new <- data.frame(A = c("A", "A", "A", "A", "C", "C", "C", "C"),
B = c("F1", "F2", "F3", "F4", "F1", "F2", "F3", "F4"))
请注意,Col1
的过滤受Col2
必须包含所有级别lvls <- c("F1", "F2", "F3", "F4")
的条件的限制,因此使用dplyr::filter
或subset
非常棘手。
它是一个长(和动态)数据集,所以我不想手动执行此操作。提前感谢您的关注。
答案 0 :(得分:4)
其中任何一个:
library(tidyverse)
df %>% group_by(A) %>%
filter(length(unique(B)) == length(levels(B)))
df %>% group_by(A) %>%
filter(n_distinct(B) == length(levels(B)))
A B <fctr> <fctr> 1 A F1 2 A F2 3 A F3 4 A F4 5 C F1 6 C F2 7 C F3 8 C F4
或者,如果您需要担心缺少值:
df %>% group_by(A) %>%
filter(length(unique(B[!is.na(B)])) == length(levels(B)))
df %>% group_by(A) %>%
filter(n_distinct(B, na.rm=TRUE) == length(levels(B)))
答案 1 :(得分:1)
以下是data.table
library(data.table)
setDT(df)[, .SD[nlevels(droplevels(B))==max(nlevels(B))], A]
# A B
#1: A F1
#2: A F2
#3: A F3
#4: A F4
#5: C F1
#6: C F2
#7: C F3
#8: C F4