【发布时间】: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 <- 1然后输入c,R 将返回 1 但也不会告诉我c()是一个函数。将c分配为常量、向量或全新函数之间几乎没有区别!这很糟糕,因为它的风格很糟糕,而不是因为 R 不知道区别(在这种情况下)。
标签: r optimization