【问题标题】:How do I update data frame variables with sapply results?如何使用 sapply 结果更新数据框变量?
【发布时间】:2015-03-03 15:25:57
【问题描述】:

我有许多 Excel 文件,在将它们保存为 CSV 文件后,我将它们加载到 R 中。每个 Excel 文件都有几个采用货币格式的列。我可以手动或使用 VBA 调整 Excel 中的每一列,但我更喜欢在 R 中转换变量。我正在使用 sapply 创建一个矩阵,其中包含新的列值和格式。

我无法使用 sapply 结果更改变量。我正在尝试在for 循环中使用带有索引的assign,但它不起作用。

这是一个示例数据框和我的代码。你能帮我修复最后一部分吗?另外,将整个内容放在for 循环中并跳过sapply 会更好吗?我来自 Stata,这是我最了解的方式,但我正在努力学习 apply 函数。

谢谢!

df <- data.frame(Price = c("$1.10", "$2.20", "($3.30)"),
    RetailPrice = c("$4.40", "$5.50", "($6.50)"), 
    stringsAsFactors = FALSE)

to.numeric <- function(var, data){

    data[,var] <- gsub("[$,]","", data[,var])
    data[,var] <- sub("^\\(","-", data[,var])
    data[,var] <- sub("\\)$","", data[,var])
    data[,var] <- as.numeric(data[,var])

    return(data[,var])
}

currency.vars <- c(
    "Price",
    "RetailPrice"
)

var.matrix <- sapply(currency.vars, to.numeric, data = df)

#Matrix looks as expected
View(var.matrix)                     
var.matrix[,1]
var.matrix[,"Price"]


for(i in 1:length(currency.vars)){

    #Doesn't work
    assign(paste("df[,", currency.vars[i], "]", sep = ""), 
        paste("var.matrix[,", i, "]", sep = ""))

}

【问题讨论】:

  • 如果你想用var.matrix替换df,那么df[] &lt;- var.matrix 还是必须在for循环中使用assign
  • 这应该可以。将#Doesn't work下面的代码替换为df[, i] &lt;- eval(parse(text=paste("var.matrix[,", i, "]", sep = "")))
  • @akrun:我不想替换整个数据框,因为在真实数据框中还有其他非货币列。我想我可以cbind var.matrix 并删除旧变量,但这会改变列的顺序。我不清楚何时需要assign
  • @dimitris_ps:很有帮助,谢谢。 BrodieG 的解决方案消除了我对这部分代码的需求。
  • @KevinM 如果df 中还有其他列,那么df[colnames(var.matrix)] &lt;- var.matrix

标签: r


【解决方案1】:

这是一个等效版本。注意我们不需要将数据框作为参数传递给我们的函数。我们使用lapply 传递列:

df[currency.vars] <- lapply(
  df[currency.vars], 
  function(x) as.numeric(sub("^\\(","-", gsub("[$,]|\\)$","", x)))
)

生产:

  Price RetailPrice
1   1.1         4.4
2   2.2         5.5
3  -3.3        -6.5

lapply与数据框一起使用有两个要点:

  1. 我们可以在一组选定的数据框列上直接lapply
  2. 我们可以直接将lapply结果分配回数据框列

这两种方法都是可能的,因为数据框实际上是它们的列的列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多