检查列表中的所有多个值是否存在于 Dataframe 中

3htmauhk  于 2023-05-20  发布在  其他
关注(0)|答案(2)|浏览(135)

我有一个 Dataframe df,它包含ids =(1,2,3,4),我有一个列表items,它包含(“a”,“B”,“c”)。我想返回包含“a”、“B”和“c”的id。除非id至少包含列表中的所有3项,否则不应返回。如果列表中有n个项目,则这应该是可扩展的。

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看起来像:
| ID|价值观|
| --------------|--------------|
| 1| B|
| 2| a|
| 2| c|
| 3| a|
| 3| B|
| 3| c|
| 四|a|
| 四|B|
| 四|c|
| 四|d|
函数应该返回ID =(3,4),但是对于ID = 4,应该只返回values =(“a”,“b”,“c”)。它不应该返回ID =(1,2)。这是我尝试的,但它不返回我想要的。它当前返回一个没有任何内容的 Dataframe 。每列都为NULL。

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')
rqcrx0a6

rqcrx0a61#

  • table*,然后使用 rowSums 子集:
x <- table(df)[, unlist(items) ]
rownames(x)[ which(rowSums(x) == 3) ]
# [1] "3" "4"
nimxete2

nimxete22#

根据项中的值对df中的项进行子集化。然后,循环遍历每个ID并检查过滤后的df的行数是否等于items列表的长度。然后过滤掉FALSE值,并将df子集为仅存在于过滤后的df中的id。

df <- df[df$values %in% items,]
for(id in df$ID){
  df_filter <- df %>% filter(ID == id)
  df_filter$Criteria[df_filter$ID == id] <- nrow(unique(df_filter %>% select(values))) >= length(items)
      }
df_filter <- df_filter %>% filter(Criteria == TRUE)
df <- df[df$ID %in% df_filter$ID,]

相关问题