拆分数据帧以传递给 R 中的 sprintf
Split Data Frame for passing to sprintf in R
我有一个 sprintf 格式字符串,我正在尝试通过它解析 R 中的数据帧。我构建了这段代码来做到这一点,但如果不是丑陋的话也没什么。执行此操作的更好方法是什么?
writeData<-function(DataSet,FirstLine,FmtString,fName){
correctLine<-function (MyLine,FmtString){
do.call(sprintf,c(FmtString,MyLine))
}
#why the ugly split code? Because otherwise it casts my nice data frame as characters which confuses sprintf.
outLines=lapply(split(DataSet,1:NROW(DataSet)),function (x){correctLine(x,FmtString)})
writeLines(unlist(outLines),fName)
return(0)
}
这是一个例子:
z=data.frame(d1=c("A","B","C"),d2=c(1,2,3),d3=c("D","E","F"),stringsAsFactors=FALSE)
fmt="%s %0.3f %s"
writeData(z,"",fmt,"~/sample.txt")
对比度:
correctLine<-function (MyLine,FmtString){do.call(sprintf,c(FmtString,MyLine))}
apply(z,1,function(x) {correctLine(x,fmt)}) #Errors out, wants a list
correctLine<-function (MyLine,FmtString){do.call(sprintf,as.list(c(FmtString,MyLine)))}
apply(z,1,function(x) {correctLine(x,fmt)}) # - still unhappy, now we have a character array. This is the problem.
如果我理解您正在尝试正确执行的操作,那么您实际上只需要对所有列调用一次 sprintf
即可进行格式化。例如
writeData <- function(DataSet,FirstLine, FmtString,fName){
outlines <- do.call("sprintf", c(FmtString, DataSet))
writeLines(outLines,fName)
return(0)
}
R 中的大多数函数旨在处理数据向量,因此只需一次传入整个列,而不是遍历行。
我有一个 sprintf 格式字符串,我正在尝试通过它解析 R 中的数据帧。我构建了这段代码来做到这一点,但如果不是丑陋的话也没什么。执行此操作的更好方法是什么?
writeData<-function(DataSet,FirstLine,FmtString,fName){
correctLine<-function (MyLine,FmtString){
do.call(sprintf,c(FmtString,MyLine))
}
#why the ugly split code? Because otherwise it casts my nice data frame as characters which confuses sprintf.
outLines=lapply(split(DataSet,1:NROW(DataSet)),function (x){correctLine(x,FmtString)})
writeLines(unlist(outLines),fName)
return(0)
}
这是一个例子:
z=data.frame(d1=c("A","B","C"),d2=c(1,2,3),d3=c("D","E","F"),stringsAsFactors=FALSE)
fmt="%s %0.3f %s"
writeData(z,"",fmt,"~/sample.txt")
对比度:
correctLine<-function (MyLine,FmtString){do.call(sprintf,c(FmtString,MyLine))}
apply(z,1,function(x) {correctLine(x,fmt)}) #Errors out, wants a list
correctLine<-function (MyLine,FmtString){do.call(sprintf,as.list(c(FmtString,MyLine)))}
apply(z,1,function(x) {correctLine(x,fmt)}) # - still unhappy, now we have a character array. This is the problem.
如果我理解您正在尝试正确执行的操作,那么您实际上只需要对所有列调用一次 sprintf
即可进行格式化。例如
writeData <- function(DataSet,FirstLine, FmtString,fName){
outlines <- do.call("sprintf", c(FmtString, DataSet))
writeLines(outLines,fName)
return(0)
}
R 中的大多数函数旨在处理数据向量,因此只需一次传入整个列,而不是遍历行。