我想请你帮忙。
我有时会尝试改进我开发的功能,但是我忽略了使用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天)。
答案 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中的代码。