我有如下数据库

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种可能性,并进行行查找但我在寻找一个更简单的算法。
我试图使用subset in来过滤一列又一列,但这同样很麻烦。在R有更容易的出路吗

最佳答案

我们可以对前三列使用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)), ]

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

关于r - 在data.frame中跨列搜索的更简单解决方案,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40255455/

10-12 19:10