R仅当列存在时才修改该列
假设我有以下代码段:R仅当列存在时才修改该列,r,dataframe,R,Dataframe,假设我有以下代码段: mainResult$Time <- formatTime(mainResult$Time, "DateAndTime") mainResult$SettleDate <- formatTime(mainResult$SettleDate, "DateAndTime") mainResult$IssueDate <- formatTime(mainResult$IssueDate, "DateAndTime") mainResult$Mat
mainResult$Time <- formatTime(mainResult$Time, "DateAndTime")
mainResult$SettleDate <- formatTime(mainResult$SettleDate, "DateAndTime")
mainResult$IssueDate <- formatTime(mainResult$IssueDate, "DateAndTime")
mainResult$Maturity <- formatTime(mainResult$Maturity, "DateAndTime")
mainResult$Bid <- formatNumber(mainResult$Bid, "withDecimals")
mainResult$Ask <- formatNumber(mainResult$Ask, "withDecimals")
mainResult$AvgBid <- formatNumber(mainResult$AvgBid, "withDecimals")
mainResult$AvgAsk <- formatNumber(mainResult$AvgAsk, "withDecimals")
mainResult$BidYield <- formatNumber(mainResult$BidYield, "withDecimals")
mainResult$AskYield <- formatNumber(mainResult$AskYield, "withDecimals")
mainResult$BidSize <- formatNumber(mainResult$BidSize, "noDecimals")
mainResult$AskSize <- formatNumber(mainResult$AskSize, "noDecimals")
mainResult$Coupon <- formatNumber(mainResult$Coupon, "withDecimals")
mainResult$Time我可能会从将要对列执行的转换的信息与执行转换的代码分离开始。像这样的
numberWithDecimals <- c("Bid","Ask","AvgBid","AvgAsk", "BidYield", "AskYield", "Coupon")
numberNoDecimals <- c("BidSize", "AskSize")
timeDateAndTime <- c("Time", "SettleDate", "IssueDate", "Maturity")
fmtColumns <- function(data, txlist, fun, fmt) {
cols <- intersect(txlist, names(data))
if(length(cols) > 0) {
data[, cols, drop=F] <- lapply(data[, cols, drop=F], fun, fmt)
}
}
mainResult <- fmtColumns(mainResult, numberWithDecimals, formatNumber, "withDecimals")
mainResult <- fmtColumns(mainResult, numberNoDecimals, formatNumber, "noDecimals")
mainResult <- fmtColumns(mainResult, timeDateAndTime , formatTime, "DateAndTime")
numberWithDecimals这是一种可怕的编码方式。尝试使用类似以下内容:
# start with a vector of column names and loop
dt_columns = c("Time", "SettleDate", "IssueDate", "Maturity")
for (col in dt_columns) {
if (col %in% names(mainResult)) mainResults[[col]] = formatNumber(mainResult[[col]], "DateAndTime")
}
# you can repeat for your other cases
或者这个:
# intersect and lapply
dt_columns = c("Time", "SettleDate", "IssueDate", "Maturity")
dt_columns = intersect(names(mainResults), dt_columns)
mainResult[dt_columns] = lapply(mainResult[dt_columns], formatNumber, "DateAndTime")
请分享一个可复制的数据框示例。我不明白。为什么不直接调用dataframe上的Lappy呢。它应该在指定的列上应用函数。