3

我有一个数据框,其中每一行都是关于瞳孔的观察。数据框中的向量之一是学校的 id。我获得了一个新向量,每个学校的计数如下:

tbsch <- table(dt$school)

现在我想将相关的计数值添加到dt. 我已经使用for()循环遍历每一行dt并创建一个包含相关计数的新向量并最后使用cbind()将其添加到 来完成它dt,但我认为这是非常低效的。有没有一种聪明/简单的方法来做到这一点?

4

4 回答 4

8

使用 jmsigner 的数据,您可以:

dt$count <- ave(dt$school, dt$school,  FUN = length)
于 2012-07-01T12:29:53.893 回答
3

这在data.tablev1.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.table1.8.1 版之前相关的答案:(感谢 Matthew 的更新)。

于 2012-07-01T12:20:30.997 回答
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")
于 2012-07-01T08:34:22.257 回答
1

您也可以使用plyr ...并使用这一个衬垫保留原始订单

join(dt, count(dt, "school"))
于 2012-07-01T10:16:16.700 回答