想要 select 基于 return 的列(在同一列中)低于 R 中的阈值

Want to select a column based on a return (within that same column) below a threshold in R

我有一个大小为 1379 x 843 的 return 数据框(xts,动物园对象)。它应该被读作 date x security。

这是输入的例子:

            BIIB.US.Equity JNJ.US.Equity BLUE.US.Equity BMRN.US.Equity AGN.US.Equity
2018-06-15   -0.5126407   0.001633853   -0.070558376   0.0846854857  -0.004426559
2018-06-18   -0.052158804  -0.310521165   -0.035226652  -0.0206967213  -0.008430535
2018-06-19    0.010099613   0.010303330    0.006510048   0.0004184976   0.007745167
2018-06-20    0.016504588  -0.004324060    0.029808774   0.0284459318   0.012366368
2018-06-21    0.001616924  -0.004834480    0.023211360   0.0009151922  -0.015411839
2018-06-22   -0.004136679   0.010374640   -0.065652522   0.0097023265   0.005322048

现在我想 return 一个不同的列表:

             BIIB.US.Equity JNJ.US.Equity
2018-06-15   -0.5126407     0.001633853
2018-06-18   -0.052158804  -0.30521165
2018-06-19    0.010099613   0.010303330
2018-06-20    0.016504588  -0.004324060
2018-06-21    0.001616924  -0.004834480
2018-06-22   -0.004136679   0.010374640

如您所见,第二个列表仅包含 2 列,因为第一个证券在 2018 年 6 月 15 日下跌了 51%,第二个证券在 2018 年 6 月 15 日下跌了 30%时间 2018-06-18。两者都超过了30%的门槛

我想要的是从我当前的数据框架中获取一个新的数据框架,该数据框架选择安全性下降 30% return 或更高实例的证券。

目前我已经尝试过:

df1 <- returns < -.3
returns[df1]

但这 return 是错误:

Error in `[.xts`(returns, df1) : 'i' or 'j' out of range

我也试过这个:

cls <- sapply(returns, function(c) any(c < -.3))
a<- returns[, cls, with = FALSE]

然而 return 是一个大小相同的矩阵,只是有很多 NA 值。 有什么我想念的吗?

基本上我希望得到的是一个大小为 1379 x(小于 843)的数据框 "df",其中 df 是所有列,其中有一个每日下降 - 的实例。 3个或更少。

编辑:
对于那些试图提供帮助的人,谢谢,但是输出 returns 是这样的(我将调用分配给 a):

    > a
     BIIB.US.Equity JNJ.US.Equity BLUE.US.Equity BMRN.US.Equity AGN.US.Equity PFE.US.Equity NBIX.US.Equity
    > summary(a)
         Index   
     Min.   :NA  
     1st Qu.:NA  
     Median :NA  
     Mean   :NA  
     3rd Qu.:NA  
     Max.   :NA  
    > str(a)
    An 'xts' object of zero-width

由于您没有提供 input/output 示例,我不确定我是否理解正确,但尝试

df[colSums(df <= -0.3, na.rm = T) > 0]

编辑

在 OP 更新后添加 na.rm = T

这应该有效:

df[, sapply(df, function(x) min(x, na.rm = TRUE) <= -0.3)]

好的,它应该这样工作,使用包 data.table : 让我们尝试使用包含一些 NA 的示例数据集。

library(data.table)
set.seed(1)
x <- rnorm(10)*0.1
y <- x 
z <- rnorm(10)+1 
equities <- data.table(x,y,z)
equities[ sample(1:10,3), x:=NA]
equities[ sample(1:10,2), y:=NA]
equities[ sample(1:10,2), z:=NA]
print(equities)
              x           y          z
 1: -0.06264538 -0.06264538         NA
 2:  0.01836433  0.01836433  1.3898432
 3: -0.08356286 -0.08356286  0.3787594
 4:  0.15952808  0.15952808 -1.2146999
 5:  0.03295078          NA  2.1249309
 6:          NA          NA  0.9550664
 7:          NA  0.04874291  0.9838097
 8:  0.07383247  0.07383247         NA
 9:          NA  0.05757814  1.8212212
10: -0.03053884 -0.03053884  1.5939013

选择正确的列,如 Melissa post 中所述:

myChoice <- sapply(equities, function(x) min(x, na.rm=T) <= -0.3)

最终:

newequities <- equities[ , myChoice , with=F]
print(newequities)
            z
 1:         NA
 2:  1.3898432
 3:  0.3787594
 4: -1.2146999
 5:  2.1249309
 6:  0.9550664
 7:  0.9838097
 8:         NA
 9:  1.8212212
10:  1.5939013

对此稍加补充,因为我今天回到工作岗位,发现答案并不完全是我想要的。如果您想 select 基于行值的列,那么我标记为正确的答案只是缺少一个逗号!

当前答案 select 需要所有行,但对于原始 post 中描述的所需输出,您必须使用命令:

returns[, sapply(returns, function(x) min(x, na.rm = TRUE) <= -.3)]

注意这在开头有一个逗号,以便 select 行。

希望这在某些时候对其他人有所帮助!