2010-11-04 66 views
0

我有以下簡單的(和工作:)功能,將以前存儲在2列(即Year和Month)中的日期信息變成某種'真實'日期格式。有沒有更好的方法來訪問這些變量而不是附加?

realDate <- function (table,year,period){ 

    if (is.character(table) == TRUE) 
    { 
    dframe <- get(table) 
    } 

    else{ 
    dframe <- table 
    } 

    attach(dframe) 
    dframe$Date <- as.Date(paste(year,"-",ifelse(period > 9,period,paste("0",period,sep="")),"-01",sep="")) 
    detach(dframe) 
    return(dframe$Date) 

}

第一個參數是一個data.frame(或it's名稱)(我需要與含有多個data.frame名稱字符向量lapply使用)。第二個參數是存儲年份的df列,期間是存儲月份的那個列。

我只是在學習這個整體環境的東西,而且我確實認爲這種附加/分離方式不是正確的方法(即使它有效)。有沒有更好的方法將指定參數「Year」和「Period」作爲粘貼語句的一部分?

編輯:

將參數作爲列名傳遞的正確方法是什麼?請注意,Year和Period的姓名可能會從data.frame更改爲data.frame。如果我使用你建議的功能我得到:

head(realDate(mydf,"Jahr","Periode")) # German for year and period 
Error in charToDate(x) : 
character string is not in a standard unambiguous format 

or 

Error in paste(year, "-", ifelse(period > 9, period, paste("0", period, : 
object 'Jahr' not found 

HTH幫助。

+0

一些示例數據會很有用。我不明白的是,你以「年」和「時期」作爲論點。這些與'dframe'有什麼關係 - 即爲什麼要附加?在'dframe' /'table'中有一個名爲「year2」和「period」的列,在這種情況下,您不需要將它們作爲參數傳遞,只需使用'with()'或'within()'。 – 2010-11-04 11:23:28

+0

我之所以把年份和期限作爲參數,是因爲標籤在我的情況下發生了變化,我必須使用的數據庫在Year中使用不同的標籤,有時它是英文標籤,有時是瑞士/德國標籤。真的很有道理,但我必須處理它。我發佈的功能只是我必須做的幾項重新整理數據中的一項。 – 2010-11-04 11:31:52

回答

7

with()使用或within() ---兩者評估一個特殊的環境內的R的表達,從而將with(f00, EXPR)該「含」的foo元件/組件的特殊環境中評估表達EXPRwithin()允許您在該特殊環境中修改/替換。

你的函數的直接翻譯版本(主位)將是:

dframe <- within(dframe, 
       Date <- as.Date(paste(year,"-", 
             ifelse(period > 9, period, 
               paste("0", period, sep = "")), 
             "-01", sep = ""))) 

但也沒有必要強迫複製數據幀只是添加一列到扔掉之前返回數據幀(您不會返回修改後的數據幀,僅返回日期)。

相反,只要使用with(),讓我們假設你的意思是dframe/table包括yearperiod列,在這種情況下,你不要;噸需要以年/期通過(否則我不明白爲什麼你需要attach):

realDate <- function (table) { 
    if (is.character(table) == TRUE) { 
     dframe <- get(table) 
    } else { 
     dframe <- table 
    } 
    resDate <- with(dframe, 
        as.Date(paste(year,"-", 
            ifelse(period > 9, period, 
             paste("0", period, sep = "")), 
            "-01", sep = "")) 
    return(resDate) 
} 
+0

對不起,對不起,對不起,是的,你的假設是完全正確的,我的意思是dframe/table包含這些因爲我不想硬編碼這些列名稱 – 2010-11-04 11:34:45

+0

如果你不想硬編碼,那麼你需要'get(year)'和'get(period)'在你的'as.Date()'調用中,IIRC然後,由於'with','get()'應該在對象中被評估,並且應該是fo und,沒有附加。所以你可以在我提供的答案中使用代碼,只需使用'get(period)'和'get(year)'而不是''period'&'year'。這部分是我的困惑,因爲你意識到你可能需要在'table'參數上使用'get()',但是使用'period'和'year'。 – 2010-11-04 15:13:29

相關問題