【问题标题】:Optimize a function to Join two tables in R优化函数以在 R 中连接两个表
【发布时间】:2014-06-04 16:45:07
【问题描述】:

我想请求你们的帮助。

有时我在尝试改进我开发的函数时遇到一些问题,但我忽略了我可以通过应用或合并等函数改进哪些步骤。

我的想法是我有两张表,一张有 3 个分类数据,“类别”、“月”、“日”和一个数字“数量”,另一个只有“月”和“日”。这是因为在第一个表中,我可能没有所有日期或月份的数据,并且我希望每个类别、月份和日期都有一行(如果没有数据,数量将为 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 天)。

【问题讨论】:

  • 嗯。我认为你需要一些非常基本的东西,在 R 中很好地实现(所以不需要构建这样的函数)。您介意提供一个示例数据以及预期的输出应该是什么样子吗?提问时请尝试关注best practices
  • 我想你只是想要merge。但是如上所述,通过阅读该代码很难判断您要做什么。尝试展示一些小的示例数据,然后展示它最后的样子。
  • 哎呀,你定义了一个变量c,然后使用了基本的c()函数——它是一个变量还是一个函数? (提示:给变量赋予与函数相同的名称是不好的)
  • @user12202013 为什么给变量与函数同名是不好的? R 可以轻松区分它们。
  • @SeñorO R 可能能够将它们区分开来,但毫无疑问,有时阅读您的代码的人会挠头并想知道发生了什么。对象应该被赋予有意义的名字并且应该表现一致。如果我说c &lt;- 1 然后输入c,R 将返回 1 但也不会告诉我c() 是一个函数。将c 分配为常量、向量或全新函数之间几乎没有区别!这很糟糕,因为它的风格很糟糕,而不是因为 R 不知道区别(在这种情况下)。

标签: r optimization


【解决方案1】:

很确定这是重复的。 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 地位不利的可能性。

【讨论】:

  • 感谢您的回答,但合并还没有解决我的问题,日历表只有 365 行(一年中每天一行)但数据表有更多行(如果我有 550 个类别,例如,我有 30 天的类别数据,该表比日历表大得多。合并不会创建我要查找的表(因为巧合的是,它每天都有月,但在不同的类别中)。我添加了一个示例,希望能澄清我的问题。我还四处寻找合并示例,但找不到问题的答案。
【解决方案2】:

回答 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 建议,然后 sapply 用于创建“日期”列

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 中的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    • 2021-10-05
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    相关资源
    最近更新 更多