【发布时间】:2022-12-13 00:22:31
【问题描述】:
我有一个数据框 df,其中包含 ids = (1, 2, 3, 4),我有一个列表,项目,其中包含 ("a"、"b"、"c")。我想返回包含“a”、“b”和“c”的 ID。它不应该返回,除非 id 至少包含列表中的所有 3 个项目。
df <- data.frame(ID = (1, 2, 2, 3, 3, 3, 4, 4, 4, 4), values = ("b", "a", "c", "a", "b", "c", "a", "b", "c", "d"))
items <- list("a", "b", "c")
df 看起来像: |编号 |价值观 | |-----|--------| |1 |乙 | |2 |一个 | |2 | c | |3 |一个 | |3 |乙 | |3 | c | |4 |一个 | |4 |乙 | |4 | c | |4 | d |
该函数应返回 ID = (3, 4),但对于 ID = 4,应仅返回 values = ("a", "b", "c")。它不应返回 ID = (1, 2)。 这是我尝试过的,但它没有返回我想要的。
Criteria.Match <- function(df, CriteriaList, criteria.string){
Pat <- as.data.frame(unique(df$ID))
colnames(Pat) <- 'ID'
Pat.Criteria_Type <- as.data.frame(unique(df[c('ID', criteria.string)]))
Pat$CriteriaMet <- sapply(Pat$ID, FUN = function(x){
setequal(Pat.Criteria_Type[Pat.Criteria_Type$ID == x,], as.data.frame(CriteriaList))
})
Pat <- Pat[which(Pat$CriteriaMet),]
df[df$ID %in% Pat$ID,]
}
Criteria.Match(df, items, 'values')
【问题讨论】:
标签: r string list dataframe comparison