2015-07-20 17 views
8

Tôi có đoạn mã sau:Tìm chỉ số của cummax bên trong một đột biến dplyr?

library(dplyr) 
set.seed(10) 
test<-data.frame(x=runif(10,0,1),y=rep(c(1,2),5)) 
test <- test %>% 
    group_by(y) %>% 
    mutate(max_then=cummax(x)) 

test 

mà kết quả đầu ra

Source: local data frame [10 x 3] 
Groups: y 

      x y max_then 
1 0.50747820 1 0.5074782 
2 0.30676851 2 0.3067685 
3 0.42690767 1 0.5074782 
4 0.69310208 2 0.6931021 
5 0.08513597 1 0.5074782 
6 0.22543662 2 0.6931021 
7 0.27453052 1 0.5074782 
8 0.27230507 2 0.6931021 
9 0.61582931 1 0.6158293 
10 0.42967153 2 0.6931021 

Tôi muốn thêm một cột đột biến mà sẽ thêm rownumber/index từ đó max_then đã được tính toán. Tôi tưởng tượng nó sẽ giống như sau. nhưng tôi không thể làm cho nó hoạt động được.

test %>% 
group_by(y) %>% 
    mutate(max_then-cummax(x), 
      max_index=which(.$x==max_then)) 

sản lượng dự kiến ​​là:

  x y max_then max_index 
1 0.50747820 1 0.5074782   1 
2 0.30676851 2 0.3067685   2 
3 0.42690767 1 0.5074782   1 
4 0.69310208 2 0.6931021   4 
5 0.08513597 1 0.5074782   1 
6 0.22543662 2 0.6931021   4 
7 0.27453052 1 0.5074782   1 
8 0.27230507 2 0.6931021   4 
9 0.61582931 1 0.6158293   9 
10 0.42967153 2 0.6931021   4 

Bất kỳ lời đề nghị? Tôi chỉ tò mò muốn xem liệu người ta có thể làm điều này trong câu lệnh mutate() hay không. Tôi có thể làm điều đó bên ngoài câu lệnh mutate().

+2

Hãy sử dụng 'set.seed'. Ngoài ra, bạn có thể giảm 10 hàng này. Cuối cùng, vui lòng cung cấp kết quả mong muốn của bạn. –

Trả lời

10

tôi sẽ chỉ phù hợp với trường hợp duy nhất trong x

test %>% 
    mutate(max_index = match(max_then, unique(test$x))) 
# Source: local data frame [10 x 4] 
# Groups: y 
# 
#    x y max_then max_index 
# 1 0.50747820 1 0.5074782   1 
# 2 0.30676851 2 0.3067685   2 
# 3 0.42690767 1 0.5074782   1 
# 4 0.69310208 2 0.6931021   4 
# 5 0.08513597 1 0.5074782   1 
# 6 0.22543662 2 0.6931021   4 
# 7 0.27453052 1 0.5074782   1 
# 8 0.27230507 2 0.6931021   4 
# 9 0.61582931 1 0.6158293   9 
# 10 0.42967153 2 0.6931021   4 
+1

phù hợp với những gì tôi đang tìm kiếm cảm ơn – Jimbo

+1

Bạn không nên cần 'test $'? – hadley

+0

@hadley nó không hoạt động đúng cách. Có vẻ như bạn cần kết hợp nó với 'ungroup()' hoặc một cái gì đó để nó hoạt động. –

Các vấn đề liên quan