2015-01-21 2 views
2

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. 
+3

실제 데이터 프레임의'dput'이 도움이 될 것입니다 – hrbrmstr

+0

예제가 추가되었습니다 – Carbon

+0

각 행에 포맷을 적용하려고합니까? 열 단위 변환을하는 것이 좋습니다. R에서는 한 번에 전체 열을 사용하는 것이 거의 항상 더 좋습니다. 또한, "이것을 할 수있는 더 좋은 방법이 있습니까?"라고 묻는 것은 도움이되지 않습니다. 당신이 성취하고자하는 것을 묘사하는 것이 낫습니다. 그렇지 않으면 코드를 리버스 엔지니어링하여 수행하려는 작업을 파악해야합니다. 샘플 입력을 제공하는 것은 좋지만 원하는 출력이 무엇인지 알려줘야합니다. – MrFlick

답변

4

것은, 당신이 정말로에만 모든 열이 한 번 sprintf를 호출 할 필요가 서식을 지정합니다. 예를 들어 R의

writeData <- function(DataSet,FirstLine, FmtString,fName){ 
    outlines <- do.call("sprintf", c(FmtString, DataSet)) 
    writeLines(outLines,fName) 
    return(0) 
} 

대부분의 함수는 오히려 행 반복보다 한번에 전체 열 전달되도록 데이터 벡터로 작동하는 것을 의미한다.

+0

녹색 확인 표시가 나타납니다. 훌륭하게 작동합니다. sprintf가 C의 함수이기 때문에 C에서와 같이 처리해야한다는 것을 의미하지는 않습니다. – Carbon