2016-01-03 2 views
0
stocks <- read.delim("stocks.txt") 
the.tickers <-unique(stocks$ticker) 
lows <- c() 
highs <- c() 
for(ticker in the.tickers) { 
     look.at <-stocks$ticker == ticker ## i do not know why the code wrote as this. Any one know? 
     lows <- append(lows,min(stocks$low[look.at],na.rm=TRUE)) ## to find lowest in the 'low' column for each ticker 
     highs <-append(highs,max(stocks$high[look.at],na.rm=TRUE)) 
} ## to find the highest in the 'high' column for each ticker 
the.tickers 

Мой вопрос: переменная look.at является булевым вектором, который содержит FALSE. Потому что в качестве тикера нет символа. Как может stocks$low вернуть числовое значение, даже если look.at - все FALSE?R программирование, извлечение с использованием []

Вот краткое описание структуры данных stocks.txt:

str(stocks) 
'data.frame': 70061 obs. of 8 variables: 
$ ticker : Factor w/ 23 levels "AAPL","AMGN",..: 12 12 12 12 12 12 12 12 12 12 ... 
$ industry: Factor w/ 7 levels "Banks","Biotechnology",..: 7 7 7 7 7 7 7 7 7 7 ... 
$ date : Factor w/ 3086 levels "1-Apr-02","1-Apr-03",..: 1291 1086 985 683 580 478 373 269 2948 2843 ... 
$ open : num 817 811 805 818 827 ... 
$ high : num 818 819 813 820 827 ... 
$ low  : num 811 806 801 813 817 ... 
$ close : num 815 811 808 814 822 ... 
$ volume : num 1464122 2098176 1838552 3099791 1651111 ... 

Как вы можете видеть, look.at является логическим объектом. И все это Ложные

head(look.at,10) 
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 

Это возвращаемое значение:

head(stocks$low[look.at],10) 
[1] 14.94 15.06 15.04 15.12 15.20 15.25 14.95 14.41 14.50 14.58 

Это не имеет смысла, почему акции $ низкая [look.at] может возвращать значение в то время как look.at все ЛОЖНЫЙ.

Переменная low - это числовая переменная, которая содержит только числа и значения NA.

head(stocks$low, 10) 
[1] 811.44 806.45 801.47 813.34 817.39 822.31 823.67 831.50 825.05 829.58 

выборка данных

> head(stocks,10) 
    ticker industry  date open high low close volume 
1 GOOG Technology 20-Mar-13 816.83 817.51 811.44 814.71 1464122 
2 GOOG Technology 19-Mar-13 811.24 819.25 806.45 811.32 2098176 
3 GOOG Technology 18-Mar-13 805.00 812.76 801.47 807.79 1838552 
4 GOOG Technology 15-Mar-13 818.50 820.30 813.34 814.30 3099791 
5 GOOG Technology 14-Mar-13 826.99 826.99 817.39 821.54 1651111 
6 GOOG Technology 13-Mar-13 827.90 830.69 822.31 825.31 1641413 
7 GOOG Technology 12-Mar-13 830.71 831.89 823.67 827.61 2008979 
8 GOOG Technology 11-Mar-13 831.69 839.70 831.50 834.82 1595678 
9 GOOG Technology 8-Mar-13 834.50 834.92 825.05 831.52 2912283 
10 GOOG Technology 7-Mar-13 834.06 836.62 829.58 832.60 2054238 

The.tickers следующим образом.

> the.tickers <- unique(stocks$ticker) 
> the.tickers 
[1] GOOG AAPL Msft C KEY WFC JPM SO DUK D HE EIX LUV AMGN GILD CELG BIIB CAT DE IMO MRO HES YPF 
Levels: AAPL AMGN BIIB C CAT CELG D DE DUK EIX GILD GOOG HE HES IMO JPM KEY LUV MRO Msft SO WFC YPF 
+0

Было бы здорово, если бы вы могли поставить минимальный воспроизводимый пример, чтобы согласиться с вашим вопросом. Что-то, с чем мы можем работать и использовать, чтобы показать вам, как можно ответить на ваш вопрос. Таким образом, другие могут также подойти к вашему вопросу и сопроводительному ответу в будущем. Вы можете посмотреть [это сообщение SO] (https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) о том, как сделать отличный воспроизводимый пример в R –

ответ

1

Мой вопрос, переменная look.at это логическое значение, как stocks$low может подобрать логическое значение и возвращает числовое значение?

look.at является булевой вектор, не является значением. Оператор скобки применяет каждое значение булева вектора к каждому значению числового вектора и возвращает новый вектор, содержащий значения stocks$low, которые соответствуют значениям TRUE в пределах look.at. Пример:

> stockprice <- c(1,2,3) 
> look.at <- c(T,F,T) 
> stockprice[look.at] 
[1] 1 3 

Mirosław Zalewski делает большую точку в комментариях, что (в отличие от того, что я думал), операция скобки будет работать, даже если look.at длиннее или короче stockprice вектора:

stockprice <- c(1,2,3,4,5) 
look.at <- c(T,F,T,T) 
stockprice[look.at] 
[1] 1 3 4 5 

> stockprice <- c(1,2,3) 
> look.at <- c(T,F,T,T) 
> stockprice[look.at] 
[1] 1 3 NA 
+0

"обратите внимание, что операция работает только в том случае, если оба вектора имеют одинаковую длину" - не верно. Логические векторные значения будут повторяться до тех пор, пока они не совпадут с длиной замещенного вектора.Если логический вектор длиннее, чем замещенный вектор, все TRUE вернут NA (какой смысл имеет смысл, поскольку в указанной позиции нет значения). Но у вас есть точка, что, когда векторы не имеют одинаковой длины, результаты могут быть непредсказуемыми. –

+0

Вы правы, спасибо! Я отредактирую ответ. – patrickmdnet

+0

Мой случай похож на> stockprice <- c (1,2,3) look.at <- c (F, F, F), shareprice [look.at] все равно дает мне значение 1,2,3. Не имеет смысла, что, например, цена акции [look.at] может забрать значение даже в look.at все равно False ?? Благодарю. – cljsibyl123

0

Если вы пытаетесь получить низкую и высокую цену за тикер, вот как я буду делать это с пакетом dplyr:

library(dplyr) 
stocks %>% group_by(ticker) %>% summarise(low = min(low, na.rm = TRUE), high = max(high, na.rm = TRUE)) 
Смежные вопросы