【问题标题】:Easier solution for searching across columns in data.frame在 data.frame 中跨列搜索的更简单的解决方案
【发布时间】:2016-10-26 06:46:45
【问题描述】:

我有一个类似下面的数据库

Var1 Var2 Var3 X Y Z
VIX  SPX  VOL  2 3 4
SPX  VIX  NA   4 4 NA
SPX  NA   NA   2 NA NA

我想将第一行与来自用户的输入隔离为 VIX、SPX 和 VOL。但是,在这样的数据库中,我不知道这些变量保存在哪种组合中。

也就是说,我们可能有 VIX 作为 Var1,SPX 作为 Var2,VOL 作为 Var3,或者我们可能有 VOL 作为 Var1,SPX 作为 Var2,VIX 作为 Var3。在这种情况下,可以有 6 种组合。

我可以连接字符串以在 R 中创建所有 6 种可能性并进行行查找。但我正在寻找一种更简单的算法。

我正在尝试使用子集来过滤一列又一列,但这同样麻烦。 R中有没有更简单的出路

【问题讨论】:

  • 所以Var1Var2Var3 应该有VIXSPXVOL ??并且输出将是满足此条件的行?
  • 是的,Var1、Var2 和 Var3 是列标题,它们可能具有六种可能组合中的任何一种的 VIX、SPX、VOL。因此,如果我的用户输入是 VOL、SPX、VIX,它应该能够搜索上述数据库并给我第一行作为输出

标签: r algorithm search dataframe multiple-columns


【解决方案1】:

我们可以对前三列逐行使用apply,并检查grepl是否具有三个可能值中的任何一个,最后使用all我们验证该行的所有三列都有接受的值。

df[apply(df[1:3], 1, function(x) all(grepl("VIX|SPX|VOL", x))), ]

#   Var1 Var2 Var3 X Y Z
#1  VIX  SPX  VOL  2 3 4

或者正如@Cath 在 cmets 中提到的那样,使用上述方法可能会导致选择一些不必要的行。我们可以改成

df[apply(df[1:3], 1, function(x) all(c("VIX", "SPX", "VOL") %in% x)), ]

确保所有三个唯一值都出现在三列中。

【讨论】:

  • 如果发生这种情况,我会选择 all(c("VIX", "SPX", "VOL") %in% x) 而不是 all(grepl("VIX|SPX|VOL", x)) 以避免选择带有例如 VIX VIX VOL 的行
  • @Cath 非常感谢!
【解决方案2】:

您也可以尝试使用data.table 包:

library(data.table)
setDT(df)[df[, all(c("VIX", "SPX", "VOL") %in% c(Var1, Var2, Var3)), by=1:3]$V1]
#   Var1 Var2 Var3 X Y Z
#1:  VIX  SPX  VOL 2 3 4

条件 all(c("VIX", "SPX", "VOL") %in% c(Var1, Var2, Var3) 允许确保所有 3 个值都存在于 3 个变量中(避免选择带有 VIX VIX VOL 的行,以防发生这种情况)。

【讨论】:

    【解决方案3】:

    我们可以使用矢量化rowSums

    df1[rowSums(Reduce(`|`, lapply(c("VIX", "SPX", "VOL"), `==`, df1[1:3])), na.rm = TRUE)==3,]
    #  Var1 Var2 Var3 X Y Z
    #1  VIX  SPX  VOL 2 3 4
    

    或另一种矢量化方法,而不是循环遍历行。

    df1[!rowSums(Vectorize(function(x) !x%in% c("VIX", "SPX", "VOL"))(df1[1:3])),]
    #  Var1 Var2 Var3 X Y Z
    #1  VIX  SPX  VOL 2 3 4
    

    【讨论】:

      猜你喜欢
      • 2019-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多