R에서 데이터 프레임을 구문 분석하려고하는 sprintf 형식 문자열이 있습니다. 나는이 코드를 만들었지 만, 추악하지는 않다. 이 작업을 수행하는 더 좋은 방법은 무엇입니까? 여기 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.
실제 데이터 프레임의'dput'이 도움이 될 것입니다 – hrbrmstr
예제가 추가되었습니다 – Carbon
각 행에 포맷을 적용하려고합니까? 열 단위 변환을하는 것이 좋습니다. R에서는 한 번에 전체 열을 사용하는 것이 거의 항상 더 좋습니다. 또한, "이것을 할 수있는 더 좋은 방법이 있습니까?"라고 묻는 것은 도움이되지 않습니다. 당신이 성취하고자하는 것을 묘사하는 것이 낫습니다. 그렇지 않으면 코드를 리버스 엔지니어링하여 수행하려는 작업을 파악해야합니다. 샘플 입력을 제공하는 것은 좋지만 원하는 출력이 무엇인지 알려줘야합니다. – MrFlick