我正在研究阅读每月时间序列数据的方法,这些数据没有以“日期”列和“数据”列的宽格式整齐排列。例如,SEMI的这个电子表格有按月份和地区组织的数据块,但年份是分开的并且在不连续的块中,以 YYYY 形式作为每个块前面的标题的年份。
我的目标是将此数据转换为连续块,其中第 1 列中的月度日期和第 2:6 列中的区域数据。将此电子表格导出为制表符分隔文件后(我发现两者gdata
都有XLConnect
问题,您可以在屏幕截图中看到的那种合并单元格存在问题)我读了它并获取了一个子集,这是dput
下面的源代码。
我采取了首先使用以下方法去除空行的方法:
mydf <- mydf[which(grepl("^$", mydf$January) == FALSE),]
然后在 Region 列中为具有年份的行添加一个标签 - 方便地,它总是出现在第二个('January')列中。
mydf[which(nchar(mydf$January) == 4) ,'Region'] <- 'mydate'
下一步是用每月日期填充这些“年”行中从 1 月到 12 月的列。我想一旦我每个月都有一个唯一的日期,我就可以使用ddply
或其他东西来处理它。
mydf[which(mydf$Region == 'mydate'), 2:13] <- apply(mydf[which(mydf$Region == 'mydate'), 2:13], 1, function(x) as.character(seq(as.Date(paste(x['January'],"-01-01", sep = "")), as.Date(paste(x['January'],"-12-01", sep = "")), by = 'month')))
这并没有像我预期的那样工作,因为该apply
函数没有按照我希望的方式生成日期 - 它们不是按顺序排列的。我将非常感谢(a)apply
步骤的特定修复或(b)可能更简单或更容易的替代方法。
数据和代码如下:
mydf <- structure(list(Region = c("", "Americas", "Europe", "Japan",
"Asia Pacific", "Worldwide", "", "", "Americas", "Europe", "Japan",
"Asia Pacific", "Worldwide", "", "", "Americas", "Europe", "Japan",
"Asia Pacific", "Worldwide", "", "", "", "Americas", "Europe",
"Japan", "Asia Pacific", "Worldwide", "", "", "Americas", "Europe",
"Japan", "Asia Pacific", "Worldwide"), January = c("1980", "413136",
"189577", "34033", "39868", "676614", "", "1981", "445504", "277290",
"33970", "44642", "801406", "", "1982", "445300", "226274", "34404",
"44989", "750967", "", "January", "1983", "457604", "232443",
"34326", "46247", "770621", "", "1984", "731009", "285740", "205644",
"85426", "1307820"), February = c("", "423748", "234818", "35104",
"42398", "736069", "", "", "440225", "274526", "33795", "44005",
"792550", "", "", "438332", "226806", "33359", "44020", "742517",
"", "February", "", "457899", "233560", "32604", "46184", "770247",
"", "", "790963", "307735", "381282", "102791", "1582770"), March = c("",
"436152", "281353", "34456", "46555", "798516", "", "", "434628",
"267259", "33709", "45206", "780802", "", "", "441313", "235612",
"32380", "43600", "752905", "", "March", "", "459498", "234986",
"31544", "48178", "774206", "", "", "856970", "339674", "574527",
"118091", "1889262"), April = c("", "455673", "288710", "34451",
"48585", "827419", "", "", "443285", "264405", "34823", "47192",
"789705", "", "", "465613", "246425", "33618", "46274", "791930",
"", "April", "", "484299", "243867", "32719", "52333", "813218",
"", "", "909873", "364465", "627400", "126954", "2028693"), May = c("",
"474441", "297343", "35092", "51102", "857977", "", "", "451221",
"255887", "35499", "48459", "791065", "", "", "487738", "249522",
"34339", "47727", "819325", "", "May", "", "507807", "246136",
"34708", "59300", "847950", "", "", "969553", "382706", "655862",
"133455", "2141576"), June = c("", "475552", "299427", "35743",
"51440", "862162", "", "", "453152", "242889", "35798", "48147",
"779986", "", "", "488564", "241273", "34360", "48871", "813068",
"", "June", "", "528620", "246710", "37345", "62910", "875586",
"", "", "991274", "388697", "672773", "135550", "2188294"), July = c("",
"473007", "302075", "37771", "51027", "863880", "", "", "454387",
"231097", "35402", "47468", "768353", "", "", "480702", "229555",
"33915", "49112", "793284", "", "July", "", "543063", "241211",
"40403", "66658", "891335", "", "", "1005742", "395852", "683854",
"138853", "2224302"), August = c("", "462125", "294497", "37628",
"49773", "844023", "", "", "450648", "213017", "34363", "46614",
"744642", "", "", "472486", "215763", "32866", "48620", "769734",
"", "August", "", "565034", "236353", "42524", "66853", "910763",
"", "", "1010739", "393337", "691731", "141101", "2236908"),
September = c("", "461968", "295501", "37310", "50280", "845059",
"", "", "459276", "215403", "33801", "47297", "755777", "",
"", "475729", "219643", "33083", "47540", "775994", "", "September",
"", "593019", "244979", "44108", "70242", "952348", "", "",
"1035725", "408658", "698992", "141944", "2285320"), October = c("",
"459862", "296522", "36399", "51220", "844003", "", "", "465096",
"218792", "34168", "47369", "765424", "", "", "467151", "225828",
"33667", "47890", "774536", "", "October", "", "618854",
"259807", "47622", "71345", "997628", "", "", "1033560",
"421043", "710563", "140154", "2305320"), November = c("",
"456832", "296283", "35769", "50531", "839415", "", "", "467288",
"232593", "35039", "47415", "782335", "", "", "461950", "237117",
"35672", "47285", "782024", "", "November", "", "641864",
"275099", "50371", "72095", "1039428", "", "", "1008836",
"441652", "732948", "133861", "2317297"), December = c("",
"460343", "291348", "35781", "48298", "835771", "", "", "460574",
"231461", "35971", "47173", "775179", "", "", "462919", "235861",
"36251", "47974", "783006", "", "December", "", "672533",
"276525", "54603", "74717", "1078379", "", "", "982210",
"442448", "731546", "132982", "2289187")), .Names = c("Region",
"January", "February", "March", "April", "May", "June", "July",
"August", "September", "October", "November", "December"), row.names = 29:63, class = "data.frame")
mydf <- mydf[which(grepl("^$", mydf$January) == FALSE),] # remove rows with nothing in the January column
mydf[which(nchar(mydf$January) == 4) ,'Region'] <- 'mydate' # add a row label for 'year' rows
mydf[which(mydf$Region == 'mydate'), 2:13] <- apply(mydf[which(mydf$Region == 'mydate'), 2:13], 1, function(x) as.character(seq(as.Date(paste(x['January'],"-01-01", sep = "")), as.Date(paste(x['January'],"-12-01", sep = "")), by = 'month')))