想要 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 行。
希望这在某些时候对其他人有所帮助!
我有一个大小为 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 行。
希望这在某些时候对其他人有所帮助!