【问题标题】:How to use sprintf() function to format columns in R如何使用 sprintf() 函数格式化 R 中的列
【发布时间】:2020-03-20 22:24:10
【问题描述】:

我是新手,正在学习 R。对于愚蠢的问题,请接受我的道歉。 我被一个错误卡住了,无法理解它到底是什么? “[.data.frame 中的错误:选择了未定义的列”

谁能帮我解决这个问题,好吗? 当我使用以下内容时: sprintf("%s", "Return (%)") 它工作正常并为我正确呈现表格。

但是如果我使用sprintf("%.1f", "Return (%)"),它会给出错误 "Error in sprintf: invalid format '%.1f'; use format %s for character objects"

现在,我将列转换为数字 sprintf("%.1f", as.numeric("Return (%)"))。 然后我再次收到以下错误:

"Error in [.data.frame: undefined columns selected"

【问题讨论】:

    标签: r


    【解决方案1】:

    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

    【讨论】:

    • 非常感谢您的快速回复并向我解释了完整的场景。我仍然无法解决问题。原问题贴在以下链接中:stackoverflow.com/questions/60747164/… 由于字数限制,这里无法解释更多。请帮忙。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-04
    • 2014-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多