R:确定列表中的所有集合是否出现在数据框中

R: Determine if all sets in a list appear in a data frame

我需要弄清楚是否在数据框中找到了项目 ID 集。
如果我只查找一组 ID,则以下代码可以正常工作:

set <- c( id1, id2, etc...)
all(subSets %in% df[,rangeOfColumns])

但是,如果集合是我要检查的各种内容的列表,则此代码无法按预期工作,我不确定如何获得此功能。

我的目标示例:

set <- list()
set[[1]] <- c(1, 2)
set[[2]] <- c(2, 3)
df <- as.data.frame(cbind(c(1:4),c(2:5)))

all(set %in% df)
#Returns TRUE

这可能不容易理解,但它确实有效。数据框按列组织,因此按行执行操作并不总是那么简单。

# Your setup had some unnecessary complications. Here it is again 
# more simply:
set <- list(1:2, 2:3)
d_f <- data.frame(1:4, 2:5) # df is already a function name so best not to use it again.

all(
  sapply(seq_along(set), 
         function(i) any(
           sapply(
             lapply(1:nrow(d_f), function(j) set[[i]] == d_f[j,]), 
             all) # Does each element of set[[i]] equal the elements in df[j]?
           )
         ) # Does it happen in any row of df?
  ) # It is true for all elements of set?

编辑:解决评论中的问题 好吧,如果它不是直截了当的,为什么不使用 df 的转置版本来使事情变得更容易?

因为数据框是一个列表,而不是矩阵。

做矩阵的事情(比如用 t 转置或使用 apply)破坏(通常没有任何警告给用户)数据框应该是什么,这是一个向量列表长度相同。

当您在数据框上使用 tapply 时,首先发生的事情是 as.matrix 应用于它。如果你的数据框有日期、字符或因子变量,那么整个事情都会被强制为 "character",它不会告诉你发生了这种情况。

可以使用 apply(就像有人所做的那样)and/or t 为您的特定问题制定答案,但除非有人完全确定,否则它会有点脆弱数据框中变量的 类。

也许针对每个集合检查每一行,如果有任何行匹配,则 return 为 TRUE。那么如果每个集合都匹配,那么整个结果就是 TRUE。

all(sapply(set, function(s) 
    any(apply(df, 1, function(x) all(x==s)))))