【问题标题】:R: Determine if all sets in a list appear in a data frameR:确定列表中的所有集合是否都出现在数据框中
【发布时间】:2018-09-27 21:34:08
【问题描述】:

我需要确定是否在数据框中找到了多组项目 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

【问题讨论】:

  • “出现在数据框中”是什么意思?你的意思是set[[1]] 恰好是df 中的一行(这是真的)?或者你的意思是set[[1]]df$V1 的子集或df$V2 的子集(这也是真的)?
  • 对不起。我的意思是如果任何一组出现在任何一行中,这是真的。因此,如果在任何行中都找到了所有集合,则整个事情都是正确的。

标签: r list dataframe search contains


【解决方案1】:

这可能不太容易理解,但确实可以。数据框按列组织,因此按行处理并不总是那么简单。

# 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 被应用到它。如果你的数据框有一个日期、字符或因子变量,那么整个事情就会被强制转换为“字符”,它不会告诉你会发生这种情况。

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

【讨论】:

  • 好吧,如果它不是直截了当的,为什么不使用 df 的转置版本来让事情变得更容易?
【解决方案2】:

也许检查每一行与每个集合并在任何行匹配时返回 TRUE。那么如果每个集合都匹配,那么整个结果就是 TRUE。

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

【讨论】:

  • 是的。很确定这就是我所追求的。我在正确的轨道上,但是通过嵌套应用获得确切的语法......呃......像你一样将它分开有助于在视觉上打破它;我需要开始这样做。
猜你喜欢
  • 1970-01-01
  • 2017-12-21
  • 1970-01-01
  • 2013-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多