在R中,我试图创建一个月份列,以通过对与我正在处理的每个人口具有相同值的另一列求和来绘制我的数据,例如:
NAME ORIG_ROW MONTH
POP1 1 1
POP1 1 2
POP1 1 3
POP2 2 1
POP2 2 2
POP2 2 3
我能够做到:
df$MONTH <- sapply(1:nrow(df), function(i) (colSums(df[0:i, c('ORIG_ROW') == df$ORIG_ROW[i]))
但是,当我尝试将其应用于大型数据集时(约825k观测值),此代码效率很低。
有人对如何提高此代码的效率提出建议吗?
答案 0 :(得分:1)
只需调用ave
即可完成所需的操作,只需将其自身分组即可。
df$MONTH <- with(df, ave(ORIG_ROW, ORIG_ROW, FUN = seq_along))
数据。
df <-
structure(list(NAME = structure(c(1L, 1L, 1L, 2L, 2L, 2L), .Label = c("POP1",
"POP2"), class = "factor"), ORIG_ROW = c(1L, 1L, 1L, 2L, 2L,
2L)), row.names = c(NA, -6L), class = "data.frame")