我有以下data.frame如何列於data.frame與的發生數添加另一列
x y
1 t1 5
2 t2 2
3 t2 7
4 t3 9
5 t1 6
如何與值的發生數在第一列等添加列以下?:
x y occ
1 t1 5 1
2 t2 2 1
3 t2 7 2
4 t3 9 1
5 t1 6 2
我有以下data.frame如何列於data.frame與的發生數添加另一列
x y
1 t1 5
2 t2 2
3 t2 7
4 t3 9
5 t1 6
如何與值的發生數在第一列等添加列以下?:
x y occ
1 t1 5 1
2 t2 2 1
3 t2 7 2
4 t3 9 1
5 t1 6 2
不是100%確定,但這是你的意思嗎?
> my.df <- data.frame(x=c("t1","t2","t2","t3","t1"), y=c(5,2,7,9,6))
> my.df <- data.frame(x=my.df$x,
+ y=my.df$y,
+ occ=sapply(1:nrow(my.df), function(i) sum(my.df$x[1:i] == my.df$x[i])))
> my.df
x y occ
1 t1 5 1
2 t2 2 1
3 t2 7 2
4 t3 9 1
5 t1 6 2
是的,完美!謝謝 ! – fp4me 2012-07-29 17:05:49
使用sequence
和rle
您整理data.frame
:
my.df <- data.frame(x=c("t1","t2","t2","t3","t1"), y=c(5,2,7,9,6))
# Order by x
my.df = my.df[order(my.df$x), ]
my.df$occ = sequence(rle(as.vector(my.df$x))$lengths)
my.df
# x y occ
# 1 t1 5 1
# 5 t1 6 2
# 2 t2 2 1
# 3 t2 7 2
# 4 t3 9 1
# Uncomment if you want to go back to original row order
# my.df[order(rownames(my.df)), ]
瞭解到我看到了,但沒有使用ave
功能。看起來你可以做到這一點,而不重新安排你的原始data.frame
:
my.df$occ = ave(as.numeric(my.df$x), as.numeric(my.df$x), FUN=seq_along)
很好的小狗之子。我知道你可以使用'ave',但是嘗試'sum'而不是'seq_along'。好的+1 – 2012-07-29 17:41:03
啊現在我明白了,你可以用cumsum來做:'ave(rep(1,length(my.df $ x)),as.numeric(my.df $ x),FUN = cumsum) – 2012-07-29 17:44:00
我也很高興能夠找到它......但是我有一個問題:它只是一個「小狗」,因爲我幾乎只是重新發布了一個已經可用的解決方案? ;-) – A5C1D2H2I1M1N2O1R2T1 2012-07-29 17:49:35
你有搜索'rle'這裏的'r'標籤下? – A5C1D2H2I1M1N2O1R2T1 2012-07-29 16:49:35
我不知道如何使用rle來計算我需要的發生列,可以給我一個例子嗎? – fp4me 2012-07-29 16:59:08
可能的重複http://stackoverflow.com/questions/10029235/cumulative-count-in-r – dickoa 2012-07-29 17:18:07