我想为矩阵创建一个数字指示器,以便对于一个变量中的每个唯一元素,它根据另一个变量中的元素创建一个长度序列。例如:
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
非常感谢任何和所有的帮助。谢谢。
No 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
A data.table
版本可能如下所示(感谢@mnel):
#library(data.table)
#frame <- as.data.table(frame)
frame[,z := seq_len(.N), by=x]
我最初的想法是使用:
frame[,z := .SD[,.I], by=x]
where .SD
指的是每个子集data.table
split by
x
. .I
返回整个行的行号data.table
. So, .SD[,.I]
返回每组内的行号。尽管,正如 @mnel 指出的,与其他方法相比,这是低效的,因为整个.SD
需要将每个组加载到内存中才能运行此计算。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)