2012-11-20 34 views
6

Giả sử tôi có vector a:R: Tạo biểu đồ từ dữ liệu tội danh

c(1, 6, 2, 4.1, 1, 2) 

Và một vector đếm b:

c(2,3,2,1,1,0) 

Tôi muốn tạo ra vector c:

c(1, 1, 6, 6, 6, 2, 2, 4.1, 1) 

Để gọi:

hist(c) 

Tôi làm cách nào để có thể tạo biểu đồ trực tiếp từ ab? Lưu ý các bản sao trong a, cũng như khoảng cách không bằng nhau.

Yêu cầu giải pháp được vector hóa. ab quá lớn đối với bạn bè và bạn bè.

Trả lời

10

?rep

> rep(a, b) 
[1] 1.0 1.0 6.0 6.0 6.0 2.0 2.0 4.1 1.0 
> 

Sửa từ khi tôi còn tò mò!

a <- sample(1:10, 1e6, replace=TRUE) 
b <- sample(1:10, 1e6, replace=TRUE) 

> system.time(rep(a, b)) 
    user system elapsed 
    0.140 0.016 0.156 
> system.time(inverse.rle(list(lengths=b, values=a))) 
    user system elapsed 
    0.024 0.004 0.028 
+0

Tôi sẽ bị chết tiệt, tôi không ngờ điều đó! – thelatemail

+0

Một người * tương đối tốt * tăng tốc, nhưng không chính xác sẽ chờ cả ngày theo cách này! – thelatemail

+0

Sự tăng tốc đó không xảy ra theo hướng tôi mong đợi! Nhưng đại diện chỉ mất 3 ký tự để gõ; Cho rằng thời gian tuyệt đối là nhanh chóng một trong hai cách, số lượng nhân vật thắng cho tôi. Vì vậy, giải pháp được chấp nhận vẫn tồn tại. –

5

Chỉ cần cho một cái gì đó khác với rep:

> inverse.rle(list(lengths=b,values=a)) 
[1] 1.0 1.0 6.0 6.0 6.0 2.0 2.0 4.1 1.0 
+0

xem chỉnh sửa cho bài đăng của tôi. phiên bản 'inverse.rle' của bạn nhanh hơn đáng kể! – Justin

+0

@Justin, xem bài đăng của tôi - nó không nên và nó không phải là. – mnel

4

Một số đo hiệu năng và một giải pháp nhanh hơn. rep.int là một thực hiện nhanh hơn rep trong trường hợp sử dụng tiêu chuẩn (từ ?rep)

rep.int(a, b) 

tôi đã không thuyết phục về điểm chuẩn trên

inverse.rle chỉ là một wrapper cho rep.int. rep.int phải nhanh hơn rep. Tôi sẽ nghĩ rằng các thành phần wrapper của inverse.rle nên chậm hơn so với việc giải thích rep() như một chức năng nguyên thủy

Một số microbenchmarking

library(microbenchmark) 

microbenchmark(rep(a,b), rep.int(a,b), 
     inverse.rle(list(values = a, lengths =b))) 
Unit: milliseconds 
             expr  min  lq median  uq 
1 inverse.rle(list(values = a, lengths = b)) 29.06968 29.26267 29.36191 29.67501 
2         rep(a, b) 25.65125 25.76246 25.84869 26.52348 
3        rep.int(a, b) 20.38604 23.31840 23.38940 23.69600 
     max 
1 72.80645 
2 69.00169 
3 66.40759 

Không có nhiều trong nó, nhưng rep.int xuất hiện người chiến thắng - đó Nên.

+2

+1 - Vâng, tôi sẽ không bị cho là nó xuất hiện. – thelatemail

+0

rep.int cho 'nội bộ'; không phải 'số nguyên'; oh các quy ước đặt tên R ... Cảm ơn rất nhiều về bài đăng bằng công cụ microbenchmark; Tôi đã học được một vài điều tối nay chắc chắn. –

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