将因子的计数添加到数据帧

时间:2012-07-01 07:30:18

标签: r dataframe

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

tbsch <- table(dt$school)

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

4 个答案:

答案 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"))