Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R仅当列存在时才修改该列_R_Dataframe - Fatal编程技术网

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呢。它应该在指定的列上应用函数。