更轻松地搜索data.frame中的列

时间:2016-10-26 06:46:46

标签: r algorithm search dataframe multiple-columns

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

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

中是否有更简单的方法

3 个答案:

答案 0 :(得分:5)

我们可以对前三列使用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可能导致选择一些不必要的行。我们可以将其改为

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

确保三列中存在所有三个唯一值。

答案 1 :(得分: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的行)。

答案 2 :(得分:0)

我们可以使用矢量化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