0

我在 R 中有这样排列的数据:

indv    time    mass
1         10    7
2          5    3
1          5    1
2          4    4
2         14    14
1         15    15

indv群体中的个体在哪里。我想为初始质量 ( mass_i) 和最终质量 ( mass_f) 添加列。我昨天了解到,我可以ddply在 plyr 中添加一个初始质量列:

sorted <- ddply(test, .(indv, time), sort)
sorted2 <- ddply(sorted, .(indv), transform, mass_i = mass[1])

它给出了一个类似的表格:

   indv mass time mass_i
1    1    1    5      1
2    1    7   10      1
3    1   10   15      1
4    2    4    4      4
5    2    3    5      4
6    2    8   14      4
7    2    9   20      4

但是,同样的方法不适用于找到最终质量 ( mass_f),因为我对每个人有不同数量的观察结果。当观察的数量可能会有所不同时,任何人都可以提出一种找到最终质量的方法吗?

4

3 回答 3

0

您可以简单地length(mass)用作最后一个元素的索引:

sorted2 <- ddply(sorted, .(indv), transform,
                 mass_i = mass[1], mass_f = mass[length(mass)])

正如 mb3041023 所建议并在下面的评论中讨论的那样,您无需对数据框进行排序即可获得类似的结果:

ddply(test, .(indv), transform,
      mass_i = mass[which.min(time)], mass_f = mass[which.max(time)])

除了行的顺序外,这与sorted2.

于 2012-11-15T20:12:33.260 回答
0

您可以使用tail(mass, 1).mass[1]

sorted2 <- ddply(sorted, .(indv), transform, mass_i = head(mass, 1), mass_f=tail(mass, 1))
于 2012-11-15T20:13:54.467 回答
0

一旦你有了这张表,它就很简单了:

t <- tapply(test$mass, test$ind, max)

ind.这将为您提供一个带有asnamesmass_fas 值的数组。

于 2012-11-15T20:15:26.373 回答