Хотите выбрать столбец на основе доходности (в том же столбце) ниже порогового значения в R - PullRequest
0 голосов
/ 25 июня 2018

У меня есть возвращаемый фрейм данных (xts, объект zoo) размером 1379 x 843. Его следует читать как дату x безопасность.

Это пример ввода:

            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

Теперь я хотел бы вернуть другой список:

             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-06-15 наблюдается спад в 51%, а во второй момент времени в 2018-06-18 - 30% для второго.Оба из них превышают порог 30%

Я хочу получить новый фрейм данных из моего текущего, который выбирает ценные бумаги, в которых есть случай 30% -ного снижения доходности ценной бумаги или больше.

В настоящее время я пробовал:

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

, но это возвращает ошибку:

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

Я также пробовал это:

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

Все же, что возвращаетматрица того же размера, только с большим количеством значений NA.Есть ли что-то, чего мне не хватает?

По сути, я бы хотел получить фрейм данных "df" размером 1379 x (что-то меньше 843), где df - это все столбцы, в которых есть экземплярежедневное падение -.3 или меньше.

РЕДАКТИРОВАТЬ:
Спасибо тем, кто пытался помочь, но вывод возвращается как таковой (я назначил вызов 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

Ответы [ 4 ]

0 голосов
/ 27 июня 2018

Небольшое дополнение к этому, потому что я вернулся сегодня на работу и заметил, что ответ не совсем то, что я хотел.Если вы хотите выбрать столбцы на основе значений строк, то при условии, что я пометил правильно, пропущена одна запятая!

Текущий ответ выбирает все необходимые строки, но для желаемого результата, описанного в исходном сообщении, вы должны использовать команду:

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

обратите внимание, что в начале запятаяДля выбора строк.

Надеюсь, это поможет кому-то еще в какой-то момент!

0 голосов
/ 25 июня 2018

Это должно работать:

df[, sapply(df, function(x) min(x, na.rm = TRUE) <= -0.3)]
0 голосов
/ 25 июня 2018

Хорошо, это должно работать таким образом, используя пакет 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

Выберите правильные столбцы, как описано в посте Мелиссы:

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
0 голосов
/ 25 июня 2018

Поскольку вы не предоставили пример ввода / вывода, я не уверен, правильно ли я вас понимаю, но попробуйте

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

Изменить

добавлено na.rm = T после обновления ОП

...