这似乎可以快速修复,但我已经被困了一段时间了。
在我的数据框中,我有一个日期列。但是,日期列显示为一行中的一年,然后是同一列中接下来几行中的那一年的所有月份,然后是下一年,然后是该年的月份,依此类推。看起来像这样:
c("2011", "7", "8", "9", "10", "11", "12", "2012", "1", "2")
我的问题是,我如何将那一年追加到每个月末?另一个主要问题是我将在不同月份和年份开始的许多不同数据框架中实现自动化。例如,一个数据框可能在2013年6月开始,而另一个数据框从2012年9月开始。
我已经考虑了很长一段时间了,并提出了以下想法: 对于每一行,查看前面的12行(一年中有多少个月)并查找字符串长度为4的元素(对于" 2012"或其他年份;每个月的字符串长度为3顺便说一下)。然而,这失败了,因为如果数据开始于2011年10月,那么。那么我们第一年只获得3个月,然后当我运行该算法时,它将进入行的负值,这将导致左右错误R上。
我真的很感谢这方面的帮助。我似乎无法解决这个问题需要解决的大量数据框架。
答案 0 :(得分:1)
将每个组标识为顺序计数器,然后按要求替换所有值:
ave(
x,
cumsum(grepl("\\d{4}", x)),
FUN=function(v) replace(v, -1, paste(v[-1],v[1],sep="-"))
)
# [1] "2011" "7-2011" "8-2011" "9-2011" "10-2011"
# [6] "11-2011" "12-2011" "2012" "1-2012" "2-2012"
答案 1 :(得分:1)
使用zoo包中的na.locf
获取每行的年份year
,然后转换为"yearmon"
类(也在动物园中)。最后省略年份(或不取决于你想要的)并根据需要选择格式化年份/月。
library(zoo)
# input
dat <- c("2011", "7", "8", "9", "10", "11", "12", "2012", "1", "2")
year <- na.locf(ifelse(nchar(dat) == 4, dat, NA))
ym <- as.yearmon(paste(year, dat, sep = "-"))
然后根据你想要的东西尝试其中一个:
na.omit(ym)
## [1] "Jul 2011" "Aug 2011" "Sep 2011" "Oct 2011" "Nov 2011" "Dec 2011" "Jan 2012" "Feb 2012"
format(na.omit(ym), "%Y-%m")
## [1] "2011-07" "2011-08" "2011-09" "2011-10" "2011-11" "2011-12" "2012-01" "2012-02"
ifelse(is.na(ym), year, format(ym))
## [1] "2011" "Jul 2011" "Aug 2011" "Sep 2011" "Oct 2011" "Nov 2011" "Dec 2011" "2012" "Jan 2012" "Feb 2012"
ifelse(is.na(ym), year, format(ym, "%Y-%m"))
## [1] "2011" "2011-07" "2011-08" "2011-09" "2011-10" "2011-11" "2011-12" "2012" "2012-01" "2012-02"
有关na.locf
和"yearmon"
类的详细信息,请参阅zoo文档。