2015-01-21 19 views
13
require(plyr) 
require(dplyr)  
set.seed(8) 
    df <- 
     data.frame(
     v1 = runif(10, -1,1), 
     v2 = runif(10, -1,1)) 

Vấn đề: Làm thế nào tôi có thể nhận được các giá trị đúng vào min() chức năng như một phần của mutate() - về cơ bản, tôi muốn gán v3 như v1 chia có kích thước nhỏ nhất là v1v2. Điều này không hoạt động:R: sử dụng min() trong vòng dplyr :: đột biến()

df <- 
     df %>% mutate(v3=ifelse(v1 !=0, v1/min(v1,v2), 0)) 

Tôi đoán tôi đang thiếu một cái gì đó thực sự đơn giản.

+3

Bạn có thể sử dụng 'pmin' tức là' chuyển đổi (df, v3 = ifelse (v1! = 0, v1/do.call (pmin, df), 0)) ' – akrun

+1

Bất kỳ lý do cụ thể nào bạn tải gói' plyr' tại đây ? Tôi không nhớ những gì nên được nạp đầu tiên, nhưng trong trường hợp này bạn không nên tải 'plyr' ở tất cả. –

+0

Phải, thông thường plyr đầu tiên, nhưng ở đây chỉ dplyr có thể được nạp. – user3375672

Trả lời

18

Từ trang giúp đỡ về ?min:

Pmax và Pmin mất một hoặc nhiều vectơ (hoặc ma trận) như các đối số và trả về một vector đơn đưa ra cực đại 'song song' (hoặc cực tiểu) của vectơ.

Mặt khác:

max và min trả lại tối đa hoặc tối thiểu của tất cả các giá trị có trong lập luận của họ

Vì vậy, bạn muốn sử dụng pmin đây. Với dplyr, một lựa chọn - như nhận xét ở trên - là như thế này:

df %>% mutate(v3 = (v1 != 0) * v1/pmin(v1,v2)) 

đẹp bên tác dụng ở đây là bạn có thể tránh sử dụng ifelse và chỉ mulitply với vector logic (TRUE/FALSE mà sau đó được chuyển đổi sang 1/0).

+2

Giải pháp rất hay. –

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