Как удалить группу данных, если последние значения obs меньше определенного значения? - PullRequest
0 голосов
/ 12 сентября 2018

Я работаю с некоторыми биржевыми данными и столкнулся с проблемой некоторых аспектов очистки моих данных.

Поскольку у меня есть данные по большинству крупнейших акций США, я хочу избавиться от всех акций, если

  1. цена акции в последний день составляет менее 25 долларов (только некоторые из них составляют #)

Как бы мне было написать код, желательно без использования цикла for?

Например - скажем, у меня есть набор данных ниже:

Date       ID    EOD_Price  
2/1/10    AAPL    45.1
2/2/10    AAPL    45.3
2/3/10    AAPL    45.1   
 ...      ...     ...
2/1/10    JXL      2.6
2/2/10    JXL      2.5
2/3/10    JXL      2.8
 ...      ...      ...
2/1/10    RXW      26.5
2/2/10    RXW      25.9
2/3/10    RXW      24.9

... По сути, мой результат будет включать только все данные для AAPL, поскольку цена на последнюю дату (3/3/10) составляет> 25.

Есть идеи, как это сделать?

приведенный ниже код - это то, что, как я думал, даст последние obs для каждой акции, которые затем я могу использовать в цикле for для поднабора, может быть (я не слишком уверен):

data %>% group_by(ID) %>% tail(EOD_Price, n=1) 

, но это дает только последнее значение для последних объектов в наборе данных.

Пожалуйста, сообщите. Я просто хочу сохранить идентификаторы, которые стоят> 25 долларов в последний день.

Большое вам спасибо! Продолжайте учиться!

Ответы [ 3 ]

0 голосов
/ 12 сентября 2018

Использование sqldf:

# Inner query: group by ID and check if EOD_Price>25 and 
#Outer query: select all rows which are belongs to the inner ID
library(sqldf)
sqldf("select * from df where ID in (select ID from df group by ID having EOD_Price>25)")

Вывод:

    Date   ID EOD_Price
1 2/1/10 AAPL      45.1
2 2/2/10 AAPL      45.3
3 2/3/10 AAPL      45.1
0 голосов
/ 12 сентября 2018

Опция с data.table

library(data.table)
setDT(df1)[, .SD[last(value) > 25], by = ID]
#      ID   date value
#1: AAPL 2/1/10  45.1
#2: AAPL 2/2/10  45.3
#3: AAPL 2/3/10  45.1

data

df1 <- structure(list(date = c("2/1/10", "2/2/10", "2/3/10", "2/1/10", 
"2/2/10", "2/3/10", "2/1/10", "2/2/10", "2/3/10"), ID = c("AAPL", 
"AAPL", "AAPL", "JXL", "JXL", "JXL", "RXW", "RXW", "RXW"), value = c(45.1, 
45.3, 45.1, 2.6, 2.5, 2.8, 26.5, 25.9, 24.9)), class = "data.frame", 
 row.names = c(NA, -9L))
0 голосов
/ 12 сентября 2018

Используя dplyr::last, вы можете выбрать только "идентификаторы" акций, в которых последнее значение превышает 25

library(dplyr) 
df %>% group_by(ID) %>% filter(last(value)>25)

# A tibble: 3 x 3
# Groups:   ID [1]
  date   ID value
  <chr>  <chr> <dbl>
1 2/1/10 AAPL   45.1
2 2/2/10 AAPL   45.3
3 2/3/10 AAPL   45.1

#Another option is using n() instead of last, 
#where n() is number of rows (observatrions) in that group
df %>% group_by(stock) %>% filter(value[n()]>25) 

data

structure(list(date = c("2/1/10", "2/2/10", "2/3/10", "2/1/10", 
 "2/2/10", "2/3/10", "2/1/10", "2/2/10", "2/3/10"), ID = c("AAPL", 
 "AAPL", "AAPL", "JXL", "JXL", "JXL", "RXW", "RXW", "RXW"), value = c(45.1, 
 45.3, 45.1, 2.6, 2.5, 2.8, 26.5, 25.9, 24.9)), class = "data.frame", row.names = c(NA,-9L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...