2015-03-19 85 views
6

Tôi có một vấn đề khá dễ hiểu, điều này khiến tôi đau buồn mặc dù có vài giờ vắt tóc, vì vậy tôi nghĩ tôi sẽ nhờ bạn giúp đỡ. Tôi đang tìm kiếm một cách đơn giản để trả lại một vectơ chỉ chứa phần tử cuối cùng của một số vector ban đầu.Lấy phần tử cuối cùng của một vector

Đây là vector ban đầu của tôi, 'a':

a<-c(0,0,1,0,0,1,0,0,1,0) 

Tôi muốn tạo ra vector 'b', đó là chiều dài tương tự như 'a', và chỉ mang yếu tố nonmissing cuối cùng của nó. Nói cách khác,

b = (0,0,0,0,0,0,0,0,1,0) 

tôi đã có thể làm điều này bằng cách xây dựng một vòng lặp chạy ngược từ cuối vector 'a' đến yếu tố đầu tiên của mình, nhưng điều đó dường decidedly thanh nha. Tôi chắc chắn có một cách tốt hơn.

Trong trường hợp bất kỳ ai tò mò, vấn đề lớn hơn: Tôi đang cố gắng thay đổi giá trị của một véc tơ trong đó nó tương ứng với phần tử nonmissing cuối cùng của một véc-tơ khác.

Cảm ơn rất nhiều vì đã giúp đỡ.

Trả lời

5

Một lựa chọn là

b<- numeric(length(a)) 
b[max(which(a!=0))] <- 1 
b 
#[1] 0 0 0 0 0 0 0 0 1 0 
7

Đây chỉ là cho vui như một lớp lót:

`[<-`(a, rev(which(as.logical(a)))[-1], 0) 
## [1] 0 0 0 0 0 0 0 0 1 0 

Và một phiên bản hơi khác nhau:

`[<-`(integer(length = length(a)), rev(which(a != 0))[1], 1) 
## [1] 0 0 0 0 0 0 0 0 1 0 
6

Tôi tin rằng điều này sẽ làm việc cũng như

ifelse(cumsum(a)==sum(a), a, 0) 
# [1] 0 0 0 0 0 0 0 0 1 0 

Giả định rằng giá trị "thiếu" là giá trị 0 và giá trị không bị thiếu là 1. Nếu bạn có các giá trị khác hơn 1, bạn sẽ làm gì

ifelse(cumsum(a!=0)==sum(a!=0), a, 0) 
4

Tôi là một chút muộn, nhưng đây là một lựa chọn:

a[head(which(a == 1), -1)] <- 0 

hoặc

replace(a, head(which(a == 1), -1), 0) 

Benchmarks

Unit: milliseconds 
     expr  min  lq median  uq max neval 
    akrun() 8.600 9.201 11.346 12.531 68.45 100 
plourde() 9.034 9.767 11.545 12.498 69.33 100 
    flick() 164.792 215.759 221.868 227.237 333.72 100 
    thomas() 4.210 6.427 8.108 9.913 66.65 100 

Chức năng

akrun <- function() { 
    b<- numeric(length(a)) 
    b[max(which(a!=0))] <- 1 
    b 
} 
plourde <- function() replace(a, head(which(a == 1), -1), 0) 
flick <- function() ifelse(cumsum(a)==sum(a), a, 0) 
thomas <- function() `[<-`(a, rev(which(as.logical(a)))[-1], 0) 
+2

Tôi tìm thấy điều này để đánh bại tất cả: 'thay thế (0 * a, which.max (cumsum (a)), 1)'. Trực giác, tôi nghĩ rằng bất cứ thứ gì sử dụng 'cái' sẽ chậm bởi vì độ dài đầu ra không được biết trước. Không phải trường hợp với 'cumsum' hay' which.max'. – flodel

3

Một tùy chọn khác đơn giản:

n = max(which(as.logical(a))) - 1 
c(numeric(n), tail(a, -n)) 
Các vấn đề liên quan