R 使用extract operator 访问对象内的信息。由于数据框也是 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"
>
注意:此答案引用了我的博客文章中的内容,Forms of the Extract Operator。