我有一个数据框,其中每一行都是关于瞳孔的观察。数据框中的一个向量是学校的id。我已经获得了一个新的载体,每个学校的计数如下:
tbsch <- table(dt$school)
现在我想将相关的计数值添加到dt
中的每一行。我使用for()
循环遍历dt
中的每一行并创建包含相关计数的新向量,最后使用cbind()
将其添加到dt
,但我认为这是非常低效的。有没有聪明/简单的方法呢?
答案 0 :(得分:8)
使用jmsigner的数据:
dt$count <- ave(dt$school, dt$school, FUN = length)
答案 1 :(得分:3)
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
具有快速分组的所有常见速度优势,并且通过引用分配新列,完全没有副本。
编辑:删除了仅与版本1.8.1之前的data.table
相关的答案:(感谢Matthew的更新)。
答案 2 :(得分:2)
您可以尝试这样的事情:
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")
答案 3 :(得分:1)
您还可以使用 plyr ...并使用此保留原始订单 衬垫
join(dt, count(dt, "school"))