优化函数以在R中连接两个表

时间:2014-06-03 16:27:10

标签: r optimization

我想请你帮忙。

我有时会尝试改进我开发的功能,但是我忽略了使用apply或merge等功能可以改进的步骤。

我的想法是,我有两个表,一个有3个分类数据,"类别","月","天"和一个数字&# 34;数量",另一个只有"月"和" day"。这是因为在第一个表中我可能没有所有日期或月份的数据,并且我希望每个类别,月份和日期都有一行(如果没有数据,则数量将为0)。

还需要创建另一个包含月份和日期的列以及" MMdd"格式。

在尝试以正确的方式进行数小时后,我决定使用"错误"方式,当然,R冻结了。这是我的代码:

filldays<- function(calendar, data) {
  categories <- levels(as.factor(data$category))
  result <- data.frame()
  for (category in categories) {

    for(j in 1:nrow(calendar)) {
      month <- calendar$month[j]
      day <- calendar$days[j]

      ##Create the data for date (MMdd) variable

      if (month < 10) {
        m <- paste("0", month, sep="")
      }
      else m <- as.character(month)
      if (day < 10) {
        d <- paste("0", day, sep="")
      }
      else d <- as.character(day)
      date <- paste(m,d, sep="")          

      ##Search the value within data data.frame

      quantity <- data[data$month == month & data$day == day & data$category == category,4]
      if (length(quantity) == 0) {
        quantity <- 0
      }

      ## store result in new data.frame

      line <- data.frame(as.character(category), as.numeric(month), as.numeric(day), as.character(date), as.numeric(quantity))
      result <- rbind(result, line)      
    }
  }
  colnames(result) <- c("category", "month", "day", "date", "quantity")
  result
}

我想要实现的是这样的。

Table with data
category     month     day     quantity
1            1         1       20
1            1         3       40
2            1         1       10
2            1         2       15    

calendar table
month    day
1        1
.
.
1        31
.
.
12       31

Table Objective:

category     month     day     date     quantity
1            1         1       0101     20
1            1         2       0102     0 (because there is no data this day)
1            1         3       0103     40
1            1         4       0104     0 (no data (till one year in months and days)
.
.
.
2            1         1       0101     10
.
.
.

由于机密性,我无法提供真实数据。抱歉。我希望这足以理解我的问题

我知道这很糟糕,但我无法想出更好的东西。我在R中优化代码方面没有太多经验。

任何帮助都会很高兴欣赏,因为当它试图执行此操作时R挂起(表格不是很大,我有555个类别*一年365天)。

2 个答案:

答案 0 :(得分:0)

很确定这是重复的。 merge上有大量有用的例子,这看起来像我以前见过的情况。你建议搜索:[r] merge all.x is.na

res <- merge(table2, table1, by= c("month" "day"), all.x=TRUE)
res$quantity[ is.na(res$quantity) ] <- 0

如果您在关闭之前删除自己的问题,则可以避免增加对您的SO站立不利行为的可能性。&#34;

答案 1 :(得分:0)

回答BondedDust我意识到问题是什么,谢谢。

我只需要为每个类别创建一个重复日历的表格。

category <- sapply(as.character(levels(as.factor(data$category))), function (x) rep(x,nrow(calendar))
category <- as.vector(category)
category <- cbind(category, calendar) ## I get a warning about row names deleted, but everything works fine

之后,BondedDust建议使用相同的合并,然后为创建&#34; date&#34;柱

m <- sapply(res$month, function(x) {if (x < 10) paste("0", x,sep="") else as.character(x)}) 
d <- sapply(res$day, function(x) {if (x < 10) paste("0", x,sep="") else as.character(x)}) 
date <- paste(m,d,sep="")

感谢大家的帮助,有时很难从Java或C中考虑更好地使用R中的代码。