创建指标

时间:2014-02-19 00:59:50

标签: r matrix indicator

我想为矩阵创建一个数字指示符,这样对于一个变量中的每个唯一元素,它会根据另一个变量中的元素创建一个长度序列。例如:

frame<- data.frame(x = c("a", "a", "a", "b", "b"), y = c(3,3,3,2,2))
frame
  x y
1 a 3
2 a 3
3 a 3
4 b 2
5 b 2

指标z应如下所示:

  x y z
1 a 3 1
2 a 3 2
3 a 3 3
4 b 2 1
5 b 2 2

任何和所有帮助都非常感谢。感谢。

5 个答案:

答案 0 :(得分:4)

ave

frame$z <- with(frame, ave(y,x,FUN=seq_along) )
frame

#  x y z
#1 a 3 1
#2 a 3 2
#3 a 3 3
#4 b 2 1
#5 b 2 2

data.table版本可能如下所示(感谢@mnel):

#library(data.table)
#frame <- as.data.table(frame)
frame[,z := seq_len(.N), by=x]

我原来的想法是使用:

frame[,z := .SD[,.I], by=x]

其中.SD是指data.table分割by x的每个子集。 .I会返回整个data.table的行号。因此,.SD[,.I]返回每个组中的行号。虽然正如@mnel指出的那样,与其他方法相比,这是低效的,因为需要将整个.SD加载到内存中,以便每个组运行此计算。

答案 1 :(得分:2)

另一种方法:

frame$z <- unlist(lapply(rle(as.numeric(frame[, "x"]))$lengths, seq_len))

答案 2 :(得分:2)

library(dplyr)
frame %.%
  group_by(x) %.%
  mutate(z = seq_along(y))

答案 3 :(得分:1)

您可以在data.frame上拆分x,并根据该列生成新的ID列:

> frame$z <- unlist(lapply(split(frame, frame$x), function(x) 1:nrow(x)))
> frame
  x y z
1 a 3 1
2 a 3 2
3 a 3 3
4 b 2 1
5 b 2 2

甚至更简单地使用data.table

library(data.table)
frame <- data.table(frame)[,z:=1:nrow(.SD),by=x]

答案 4 :(得分:1)

尝试此选项,其中x是要进行分组的列,y是任何数字列。如果没有数字列,请使用seq_along(x)代替y

transform(frame, z = ave(y, x, FUN = seq_along))