2010-11-04 64 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