按组划分分组数据意味着r

时间:2015-12-17 16:13:22

标签: r

我将数据分为两类:

z= Tracer time treatment
    15 0 S
    20 0 S
    25 0 X
    04 0 X
    55 15 S
    16 15 S
    15 15 X
    20 15 X

我希望将Tracer的每个值除以组的平均值,具体取决于它属于哪个组(例如,Tracer的所有值属于时间= 0,治疗= S除以它们的平均值)。

程序将是这样的: 查找类别表示如下:

1:

aggmeanz <-aggregate(z$Tracer, list(time=z$time,treatment=z$treatment), FUN=mean)

2:将z$Tracer除以正确的aggmeanz

structure(list(Tracer = c(15L, 20L, 25L, 4L, 55L, 16L, 15L, 20L
), time = c(0L, 0L, 0L, 0L, 15L, 15L, 15L, 15L), treatment = structure(c(1L, 
1L, 2L, 2L, 1L, 1L, 2L, 2L), .Label = c("S", "X"), class = "factor")), .Names = c("Tracer", 
"time", "treatment"), class = "data.frame", row.names = c(NA, 
-8L))

4 个答案:

答案 0 :(得分:3)

或者,这是一个dplyr解决方案:

library(dplyr)
group_by(z,time,treatment) %>% 
  mutate(pmean=Tracer/mean(Tracer))

输出:

  Tracer  time treatment     pmean
   (int) (int)    (fctr)     (dbl)
1     15     0         S 0.8571429
2     20     0         S 1.1428571
3     25     0         X 1.7241379
4      4     0         X 0.2758621
5     55    15         S 1.5492958
6     16    15         S 0.4507042
7     15    15         X 0.8571429
8     20    15         X 1.1428571

数据:

z <- read.table(text="Tracer time treatment
15 0 S
20 0 S
25 0 X
04 0 X
55 15 S
16 15 S
15 15 X
20 15 X",head=TRUE)

答案 1 :(得分:2)

使用非基础工具可以吗?安装并加载data.table后:

z <- data.table(z)
z[, scaledTracer := Tracer/mean(Tracer), by = c("time","treatment")]

计算是指timetreatment的每个唯一组合(在您的数据中似乎是2行的组),并按每个组中的Tracer值进行缩放适当的意思。

答案 2 :(得分:1)

它不是最漂亮但是:

 groupmeans = aggregate(z$Tracer, by = list(z$time, z$treatment), FUN = mean)

  Group.1 Group.2    x
       0       S 17.5
      15       S 35.5
       0       X 14.5
      15       X 17.5
 names(groupmeans) = c("time", "treatment", "groupmean")
 z = merge(z, groupmeans, id.vars = c("time","treatment" ))

 time treatment groupmean Tracer tracer_div
    0         S      17.5     15  0.8571429
    0         S      17.5     20  1.1428571
    0         X      14.5     25  1.7241379
    0         X      14.5      4  0.2758621
   15         S      35.5     55  1.5492958
   15         S      35.5     16  0.4507042
   15         X      17.5     15  0.8571429
   15         X      17.5     20  1.1428571

z$tracer_div = z$Tracer/z$groupmean

 time treatment groupmean Tracer tracer_div
    0         S      17.5     15  0.8571429
    0         S      17.5     20  1.1428571
    0         X      14.5     25  1.7241379
    0         X      14.5      4  0.2758621
   15         S      35.5     55  1.5492958
   15         S      35.5     16  0.4507042
   15         X      17.5     15  0.8571429
   15         X      17.5     20  1.1428571

如果您不想创建一个全新的列,可以将z $ Tracer重新分配到最后一步。如果你想在以后的另一个计算或绘图中使用它,可以保持每一步都很好。

答案 3 :(得分:1)

基础R解决方案:

do.call(c, lapply(split(z[1], z[, -1]), FUN = function(x) x[[1]]/mean(x[[1]])))

    # 0.S1      0.S2     15.S1     15.S2      0.X1      0.X2     15.X1     15.X2 
#0.8571429 1.1428571 1.5492958 0.4507042 1.7142857 0.2857143 0.8571429 1.1428571 

首先拆分为time x treatment组,然后按平均值划分每组。最后再与c粘合在一起。