我想为矩阵创建一个数字指示符,这样对于一个变量中的每个唯一元素,它会根据另一个变量中的元素创建一个长度序列。例如:
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
任何和所有帮助都非常感谢。感谢。
答案 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))