我有一个数据框,其中每一行都是关于瞳孔的观察。数据框中的向量之一是学校的 id。我获得了一个新向量,每个学校的计数如下:
tbsch <- table(dt$school)
现在我想将相关的计数值添加到dt
. 我已经使用for()
循环遍历每一行dt
并创建一个包含相关计数的新向量并最后使用cbind()
将其添加到 来完成它dt
,但我认为这是非常低效的。有没有一种聪明/简单的方法来做到这一点?
使用 jmsigner 的数据,您可以:
dt$count <- ave(dt$school, dt$school, FUN = length)
这在data.table
v1.8.1 中要容易得多。:=
现在按组工作。组不必是连续的,它保留原始顺序。这只是一行:
library(data.table)
# set up data
set.seed(2)
npupils <- rpois(10, 20)
pupil <- unlist(lapply(npupils, seq_len))
school <- rep(seq_along(npupils), npupils)
dt <- data.table(school = school, pupil = pupil) # Create a data.table
dt <- dt[sample(seq_len(nrow(dt)))] # Mix it up
dt
school pupil
1: 5 2
2: 6 13
3: 2 14
4: 5 3
5: 10 14
---
186: 3 11
187: 7 2
188: 8 12
189: 3 6
190: 7 10
(dt[, schoolSize := .N, by = school])
school pupil schoolSize
1: 5 2 16
2: 6 13 18
3: 2 14 15
4: 5 3 16
5: 10 14 24
---
186: 3 11 14
187: 7 2 28
188: 8 12 19
189: 3 6 14
190: 7 10 28
这具有快速分组的所有通常速度优势,并且通过引用分配新列而根本没有副本。
编辑:删除了仅与data.table
1.8.1 版之前相关的答案:(感谢 Matthew 的更新)。
你可以尝试这样的事情:
dt <- data.frame(p=1:20, school=sample(1:5, 20, replace=T))
tbsch <- table(dt$school)
tbsch <- data.frame(tbsch)
merge(dt, tbsch, by.x="school", by.y="Var1")
您也可以使用plyr ...并使用这一个衬垫保留原始订单
join(dt, count(dt, "school"))