我在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
)的列。我昨天了解到,我可以使用plyr中的ddply
添加初始质量列:
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
),因为我对每个人的观察数量不同。当观察的数量可能有所不同时,是否有人可以建议找到最终质量的方法?
答案 0 :(得分: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
相同。
答案 1 :(得分:0)
您可以使用tail(mass, 1)
代替mass[1]
。
sorted2 <- ddply(sorted, .(indv), transform, mass_i = head(mass, 1), mass_f=tail(mass, 1))
答案 2 :(得分:0)
有了这张桌子,就很简单了:
t <- tapply(test$mass, test$ind, max)
这会为您提供一个数组ind.
作为names
和mass_f
作为值。