0

最新のデータが含まれるようにサブセット化したいデータ フレームがあります。df を一度に db に挿入できるように、このようにする必要があります。私のデータフレームは次のようになります。

dput(pp)
structure(list(DATE_TIME = structure(c(1369320180, 1369321980, 
1369323780, 1369325580, 1369327380, 1369285980, 1369287780, 1369289580, 
1369291380, 1369293180, 1369294980, 1369296780, 1369298580, 1369300380, 
1369302180, 1369303980, 1369305780, 1369307580, 1369309380, 1369311180
), class = c("POSIXct", "POSIXt"), tzone = ""), SITE = c("Home Page Login", 
"Home Page Login", "Home Page Login", "Home Page Login", "Home Page Login", 
"Home Page Login", "Home Page Login", "Home Page Login", "Home Page Login", 
"Home Page Login", "Home Page Login", "Home Page Login", "Home Page Login", 
"Home Page Login", "Home Page Login", "Home Page Login", "Home Page Login", 
"Home Page Login", "Home Page Login", "Home Page Login"), RESPONSE_TIME = c("0.728", 
"0.513", "0.308", "0.432", "0.877", "0.541", "0.736", "0.333", 
"0.354", "0.279", "0.178", "0.699", "0.583", "-", "0.372", "0.972", 
"1.066", "0.550", "0.246", "0.299"), AVAIL_PERCENT = c("100.00", 
"100.00", "100.00", "100.00", "100.00", "100.00", "100.00", "100.00", 
"100.00", "100.00", "100.00", "100.00", "100.00", "-", "100.00", 
"100.00", "100.00", "100.00", "100.00", "100.00"), AGENT = c(42627, 
42627, 42627, 42627, 42627, 42627, 42627, 42627, 42627, 42627, 
42627, 42627, 42627, 42627, 42627, 42627, 42627, 42627, 42627, 
42627)), .Names = c("DATE_TIME", "SITE", "RESPONSE_TIME", "AVAIL_PERCENT", 
"AGENT"), row.names = c(NA, 20L), class = "data.frame")

データ フレームの名前をパラメーターとして取り、データ フレームを一度に 1 つのエージェントと 1 つのサイトに移動し、データベースに移動して最新のタイム スタンプを取得し、データ フレームをサブセット化する関数を作成しました。最終的なデータ フレームが db に挿入されます。私の機能は次のとおりです。

normal<-function(x) {
    x<-unique(x)
    pagelist<-unique(x$SITE)
    agentlist<-unique(x$AGENT)
    latest<-data.frame(DATE_TIME=as.POSIXct(character()), SITE=character(), RESPONSE_TIME=as.numeric(character()), AVAIL_PERCENT=as.numeric(character()), AGENT=as.numeric(character()))
for(j in 1:length(agentlist)){  
    new<-subset(x, AGENT==agentlist[j])
    for(i in 1:length(pagelist)) {

        sql1<-c("SELECT max(T.DATE_TIME) FROM <TABLE NAME> T where T.SITE=")
        sql2<-pagelist[i]
        sql<-paste(sql1, sql2, sep="'")
        sql<-gsub("\\Z","'", sql, perl=T)

        sql<-paste(sql, "and T.AGENT=", sep=" ")
        sql<-paste(sql, agentlist[j], sep="'")
        sql<-gsub("\\Z","'", sql, perl=T)
        print(sql)
        ch=odbcConnect("<userid>",pwd = "<passwd>")
        latest_date<-sqlQuery(ch, sql)
        odbcClose(ch)
        latest_date<-latest_date[1,1]
        new1<-subset(new, SITE==pagelist[i] & DATE_TIME > latest_date)
        latest<-rbind(new1, latest)
        print(head(latest,5))
        return(latest)
    }
}
}

私がこれを行うとき:

df<-ノーマル(pp)

1 つのサイトと 1 つのエージェントしか取得できません。最終的な df には、各サイトのすべてのエージェントが含まれている必要があります。私がここで間違っていることは何ですか?

4

1 に答える 1

1

return ステートメントをループの外側に配置する必要がありました。

normal<-function(x) {
        x<-unique(x)
        pagelist<-unique(x$SITE)
        agentlist<-unique(x$AGENT)
        latest<-data.frame(DATE_TIME=as.POSIXct(character()), SITE=character(), RESPONSE_TIME=as.numeric(character()), AVAIL_PERCENT=as.numeric(character()), AGENT=as.numeric(character()))
    for(j in 1:length(agentlist)){  
        new<-subset(x, AGENT==agentlist[j])
        for(i in 1:length(pagelist)) {

            sql1<-c("SELECT max(T.DATE_TIME) FROM <TABLE NAME> T where T.SITE=")
            sql2<-pagelist[i]
            sql<-paste(sql1, sql2, sep="'")
            sql<-gsub("\\Z","'", sql, perl=T)

            sql<-paste(sql, "and T.AGENT=", sep=" ")
            sql<-paste(sql, agentlist[j], sep="'")
            sql<-gsub("\\Z","'", sql, perl=T)
            print(sql)
            ch=odbcConnect("<userid>",pwd = "<passwd>")
            latest_date<-sqlQuery(ch, sql)
            odbcClose(ch)
            latest_date<-latest_date[1,1]
            new1<-subset(new, SITE==pagelist[i] & DATE_TIME > latest_date)
            latest<-rbind(new1, latest)
            print(head(latest,5))
                }
    }
    return(latest)

    }
于 2013-05-28T16:29:02.083 に答える