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