R использует оператор извлечения для доступа к информации внутри объекта. Поскольку фрейм данных также является объектом R, мы используем оператор извлечения для доступа к столбцам в фрейме данных.
Первая функция sprintf()
не работает, поскольку она интерпретирует "Return (%)"
как текст и, следовательно, генерирует ошибку неверного формата.
Вторая функция sprintf()
завершается ошибкой, поскольку as.numeric("Return (%)")
анализируется как неполная ссылка на столбец во фрейме данных.
Чтобы извлечь столбцы из фрейма данных, можно использовать несколько форм оператора извлечения:
1. dataframe[rows,columns]
2. dataframe[,"columnName"]
3. dataframe[["columnName"]]
4. dataframe$columnName
Поскольку столбцы могут ссылаться по имени или положению (слева направо), один Чтобы решить проблему, описанную в вопросе, используйте номер столбца с оператором извлечения для ссылки на столбец процентного возврата, как показано ниже.
textFile <- "symbol,Return (%)
AAPL,23.1
GOOG,30.5
IBM,11.8
MSFT,14"
stockReturns <- read.csv(text=textFile)
# version that works: Return (%) is second column in data frame
sprintf("%.1f",stockReturns[,2])
... и вывод:
> sprintf("%.1f",stockReturns[,2])
[1] "23.1" "30.5" "11.8" "14.0"
>
Почему произошла ошибка?
Когда мы печатаем фрейм данных, мы видим, как R анализировал имя столбца при чтении заголовка через read.csv()
.
stockReturns
> stockReturns
symbol Return....
1 AAPL 23.1
2 GOOG 30.5
3 IBM 11.8
4 MSFT 14.0
>
Интересно! R преобразует пробел и специальные символы в ....
. Теперь давайте попробуем sprintf()
еще раз с тем, как R интерпретировал имя столбца, и с формой [[
оператора извлечения.
> sprintf("%.1f", stockReturns[["Return...."]])
[1] "23.1" "30.5" "11.8" "14.0"
>
Теперь, когда мы знаем, что проблема вызвана специальными символами в имени столбца, мы можем использовать функцию colnames()
, чтобы переименовать имя столбца Return (%)
во что-то, на что мы можем более легко ссылаться в R код. Это позволяет использовать несколько форм оператора извлечения для доступа к столбцу из фрейма данных.
colnames(stockReturns) <- c("symbol","return_pct")
sprintf("%.1f",stockReturns[["return_pct"]])
sprintf("%.1f",stockReturns$return_pct)
sprintf("%.1f",stockReturns[,"return_pct"])
... и вывод:
> colnames(stockReturns) <- c("symbol","return_pct")
> sprintf("%.1f",stockReturns[["return_pct"]])
[1] "23.1" "30.5" "11.8" "14.0"
> sprintf("%.1f",stockReturns$return_pct)
[1] "23.1" "30.5" "11.8" "14.0"
> sprintf("%.1f",stockReturns[,"return_pct"])
[1] "23.1" "30.5" "11.8" "14.0"
>
Примечание: этот ответ ссылается на содержание из моей статьи блога, Формы оператора извлечения .