Конвертировать в данные в длинном формате - PullRequest
0 голосов
/ 09 мая 2018

У меня есть кадр данных (df), как показано:

head(df)
Year     X1     X2     X3     X4     X5     X6     X7     X8     X9....X36

1 1970     NA     NA     NA     NA     NA     NA     NA     NA     NA.....
2 1971 123.47 110.19 125.49 121.12 109.23  78.92 111.75  90.70  91.95.....
3 1972 142.20 131.95 173.17 222.52 220.85 175.16 180.09 165.64 164.35.....
4 1973 192.60 174.36 207.86 182.91 170.26 128.39 164.50 157.06 151.11.....
5 1974 214.89 200.21 221.03 188.61 175.43 137.63 156.84 142.45 155.58.....
6 1975 141.88 132.59 154.14 139.14 139.78  81.49 105.59 101.58 113.15.....

str(df)
'data.frame':   48 obs. of  37 variables:
 $ Year: num  1970 1971 1972 1973 1974 ...
 $ X1  : num  NA 123 142 193 215 ...
 $ X2  : num  NA 110 132 174 200 ...
 $ X3  : num  NA 125 173 208 221 ...
 $ X4  : num  NA 121 223 183 189 ...
 $ X5  : num  NA 109 221 170 175 ...
 $ X6  : num  NA 78.9 175.2 128.4 137.6 ...
 $ X7  : num  NA 112 180 164 157 ...
 $ X8  : num  NA 90.7 165.6 157.1 142.4 ...
 $ X9  : num  NA 92 164 151 156 ...
 $ X10 : num  NA 81.8 137 136.7 137.5 ...
 ..
 $ X36  :num  NA ..................

Приведенные выше данные представляют собой десять ежедневных данных (по 3 наблюдения за каждый месяц), что составляет 36 наблюдений за год. Первое наблюдение 3 (X1, X2, X3) соответствует январскому месяцу, а второе наблюдение 3 (X4, X5, X6) соответствует февральскому месяцу и впоследствии следует той же схеме для остальной части месяца. Поэтому мой вопрос: как я могу преобразовать эти данные, чтобы они выглядели так:

Year Month Value
1971 Jan   123.47
1971 Jan   110.19
1971 Jan   125.49
1971 Feb   121.12
1971 Feb   109.23
1971 Feb   78.92
..................
1971 Dec   150
1972 Jan   180

Я попробовал следующее, но, похоже, не работает.

df_L <- df %>%
  gather(key = "Month", value = "Value", X1:X36) %>%
  mutate(Month = as.numeric(str_replace(Month, "X", "")))

Любая помощь будет оценена

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Взял данные у @Roman Lustrik

xy = data.frame(year = 1970:1974, matrix(runif(5*6), ncol = 6))
df = as.data.frame(t(subset(xy, select = -c(year)))) #transposing and subsetting 
d1 = data.frame(Value = unlist(df, use.names = FALSE)) # adding one column below another 



cbind(year = rep(xy$year, each = 6), month = rep(c("Jan","Feb"),each = 3),Value = d1)

# req =  cbind(year = rep(1971:1975, each = 36), month = rep(month.abb,each = 3),)
0 голосов
/ 09 мая 2018

Вы почти у цели.

xy <- data.frame(year = 1970:1974, matrix(runif(5*6), ncol = 6))

months <- c("Jan", "Feb")
colnames(xy)[-1] <- paste(rep(months, each = 3), rep(1:3, times = length(months)), sep = ".")

library(tidyr)
out <- gather(xy, key = "month", value = "value", -year)

out$month <- gsub("\\.\\d{1}$", "", out$month)

head(out)

  year month     value
1 1970   Jan 0.9749443
2 1971   Jan 0.3167903
3 1972   Jan 0.5024181
4 1973   Jan 0.5217141
5 1974   Jan 0.1422871
6 1970   Jan 0.2429328

В этом примере я создал уникальные имена столбцов и удалил точечно-цифровой идентификатор, используя gsub. Вы сможете использовать этот код после того, как введете все месяцы в переменную months. Предполагается, что каждый месяц состоит из трех повторов. Это предположение, естественно, можно ослабить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...