如何规范R中的时间序列数据?

时间:2015-08-21 16:07:01

标签: r

我有下面的矩阵。如何用平均值划分每一行?

 TAXA   1992    1993    1994     1995   
 Aba    1        0      0.01     0  
 Abr    2      0.084    0.1      3  
 Amp    7         6     4        2

2 个答案:

答案 0 :(得分:5)

我想你想要其中任何一个 -

对于数据框:

cbind(df[1], df[-1] / rowMeans(df[-1]))
#   TAXA    X1992      X1993      X1994     X1995
# 1  Aba 3.960396 0.00000000 0.03960396 0.0000000
# 2  Abr 1.543210 0.06481481 0.07716049 2.3148148
# 3  Amp 1.473684 1.26315789 0.84210526 0.4210526

对于矩阵:

m / rowMeans(m)
#         1992       1993       1994      1995
# Aba 3.960396 0.00000000 0.03960396 0.0000000
# Abr 1.543210 0.06481481 0.07716049 2.3148148
# Amp 1.473684 1.26315789 0.84210526 0.4210526

这会找到每行的平均值,然后将每行除以其对应的平均值。第一个假设您的示例中的第一列实际上是一列,而第二列假设它是矩阵中的行名称。

数据:

df <- structure(list(TAXA = structure(1:3, .Label = c("Aba", "Abr", 
"Amp"), class = "factor"), X1992 = c(1L, 2L, 7L), X1993 = c(0, 
0.084, 6), X1994 = c(0.01, 0.1, 4), X1995 = c(0L, 3L, 2L)), .Names = c("TAXA", 
"X1992", "X1993", "X1994", "X1995"), class = "data.frame", row.names = c(NA, 
-3L))

m <- structure(c(1, 2, 7, 0, 0.084, 6, 0.01, 0.1, 4, 0, 3, 2), .Dim = 3:4, .Dimnames = list(
    c("Aba", "Abr", "Amp"), c("1992", "1993", "1994", "1995"
    )))

答案 1 :(得分:1)

使用'tidy data'方法(我将数据从问题复制到剪贴板):

t <- read.table("clipboard", sep=" ", header=T)

library(tidyr)
library(dplyr)
t %>% 
  gather(year, value, -TAXA) %>% 
  group_by(TAXA) %>% 
  mutate(value=value / mean(value)) %>% 
  spread(year, value)

你得到:

Source: local data frame [3 x 5]

  TAXA    X1992      X1993      X1994     X1995
1  Aba 3.960396 0.00000000 0.03960396 0.0000000
2  Abr 1.543210 0.06481481 0.07716049 2.3148148
3  Amp 1.473684 1.26315789 0.84210526 0.4210526

它将许多列中的值收集到一个列中。 (他们得到相同的处理,他们应该在一列中。)然后它分别计算每个TAXA的平均值,并将数据重新格式化为宽格式。