我有下面的矩阵。如何用平均值划分每一行?
TAXA 1992 1993 1994 1995
Aba 1 0 0.01 0
Abr 2 0.084 0.1 3
Amp 7 6 4 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
的平均值,并将数据重新格式化为宽格式。