2015-08-21 3 views

ответ

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.0.06481481 0.07716049 2.3148148 
3 Amp 1.473684 1.26315789 0.84210526 0.4210526 

Он собирает значения из множества столбцов в один. (Они получают одинаковое обращение, они должны быть в одной колонке.) Затем он вычисляет среднее значение для каждого TAXA отдельно и переформатирует данные обратно в широкий формат.

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.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.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" 
    ))) 
Смежные вопросы