My aim is to transform my quarterly time series data to a table format without having labels to the years and quarters on the columns. I also don't want serial numbers.
I have the dput of the data here:
dput(rainfall)
structure(c(26.3333333333333, 129.5, 250.8, 59.5666666666667,
29.0333333333333, 157.8, 138.1, 68.6, 55.3, 196.2, 118.033333333333,
120.733333333333, 31.0333333333333, 166.5, 48.2666666666667,
91.4333333333333, 24.3333333333333, 113.933333333333, 98.3666666666667,
69, 50.2, 171.2, 142.7, 88.4, 26.7, 172.433333333333, 251.733333333333,
58.1666666666667, 26.1, 125.433333333333, 273.5, 91.7, 22.5666666666667,
158, 156.466666666667, 48.5333333333333, 46.3333333333333, 126.4,
92.9, 37.1333333333333, 2.36666666666667, 184.233333333333, 94.6666666666667,
50.9333333333333, 30.9333333333333, 177.566666666667, 184.266666666667,
60.7333333333333, 39.3333333333333, 150.566666666667, 299.7,
68.0666666666667, 49.0666666666667, 168.533333333333, 133.5,
59.9, 53.4666666666667, 141.6, 281.4, 75.3333333333333, 41.9666666666667,
200.8, 176.233333333333, 94.5666666666667, 30.2333333333333,
139.333333333333, 207.4, 45.8, 6.93333333333333, 146, 163.166666666667,
67.2, 20.0333333333333, 201.133333333333, 201.8, 48.1666666666667,
18.9666666666667, 138.6, 169.733333333333, 64.1666666666667,
79.5, 131.866666666667, 159.6, 70.4, 21.2, 78.4333333333333,
163.833333333333, 96, 48.5, 177, 196.333333333333, 62.1333333333333,
37.6333333333333, 119.366666666667, 243.666666666667, 49.4333333333333,
35.3666666666667, 161.1, 121.166666666667, 111, 3.6, 98.3333333333333,
88.7333333333333, 74.1, 63.8666666666667, 187.7, 183.566666666667,
115.866666666667, 36.2333333333333, 126.066666666667, 240.833333333333,
35.4333333333333, 27.0666666666667, 192.2, 186.366666666667,
17.4833333333333, 15.5166666666667, 166.633333333333, 238.65,
77.6833333333333, 38.2833333333333, 125.983333333333, 188.916666666667,
94.1666666666667, 20.8666666666667, 174.916666666667, 110.8,
66.6, 42.6333333333333, 206.25, 161.5, 56.5333333333333, 22.6666666666667,
106.116666666667, 173.166666666667, 44.3666666666667, 5.31666666666667,
193.406666666667, 177.266666666667, 71.2833333333333, 33.2833333333333,
168.6, 221.366666666667, 41.2666666666667, 22.8, 180.866666666667,
118.7, 49.4833333333333, 39.95, 170.533333333333, 260.783333333333,
170.833333333333, 68.9666666666667, 157.833333333333, 250.733333333333,
90.1166666666667, 46.6833333333333, 149.356666666667, 175.65,
68.3, 54.6833333333333, 166.65, 131.183333333333, 80.6833333333333
), .Dim = c(164L, 1L), .Dimnames = list(NULL, "rainfall"), .Tsp = c(1973,
2013.75, 4), class = "ts")
This is the code I used:
library(zoo)
new_data <- data.frame(yq = yearqtr(index(rainfall)), val = rainfall)
Here is the output:
yq rainfall
1 1973 Q1 26.333333
2 1973 Q2 129.500000
3 1973 Q3 250.800000
4 1973 Q4 59.566667
5 1974 Q1 29.033333
6 1974 Q2 157.800000
7 1974 Q3 138.100000
8 1974 Q4 68.600000
9 1975 Q1 55.300000
10 1975 Q2 196.200000
I don't want the serial numbers and label on the quarter column.
Looking forward to hearing from anyone who may assist.
CodePudding user response:
It is difficult to tell what you want without the question showing what it is but maybe you want this which gives a zoo object which displays as shown:
as.zoo(rainfall)
## rainfall
## 1973 Q1 26.333333
## 1973 Q2 129.500000
## 1973 Q3 250.800000
## 1973 Q4 59.566667
...snip...
or in terms of new_data this gives the same output.
read.zoo(new_data, drop = FALSE)
or maybe you want one of these which give data frames with the year/quarter as row names.
as.data.frame(as.zoo(rainfall))
## rainfall
## 1973 Q1 26.333333
## 1973 Q2 129.500000
## 1973 Q3 250.800000
## 1973 Q4 59.566667
...snip...
or this gives the same output but is in terms of new_data:
as.data.frame(read.zoo(new_data, drop = FALSE))
The description of "serial number" is unclear and the output shows what you don't want rather than what you do want so we really don't know what it is but maybe these will help:
c(cycle(rainfall)) # 1, 2, 3, etc. (the quarter number)
paste0("Q", cycle(rainfall)) # Q1, Q2, etc.
quarters(time(as.zoo(rainfall))) # same
format(time(as.zoo(rainfall)), "Q%q") # same
If what you meant is how to display new_data without the row names:
write.table(new_data, row.names = FALSE)
or without row names and without the year/quarter column:
write.table(new_data[, 2, drop = FALSE], row.names = FALSE)
or in terms of rainfall
write.table(rainfall, row.names = FALSE)
Note that these give a one column data frame and matrix in terms of new_data
new_data[, 2, drop = FALSE] # data frame
cbind(rainfall = new_data[[2]]) # 1 column matrix
or in terms of rainfall:
as.data.frame(rainfall) # data frame
rbind(rainfall) # 1 column matrix