2011-01-18 42 views
6

Tôi có một tập hợp các phép đo thực hiện thường xuyên, nhưng có mấy người mất tích:Làm thế nào để kết hợp hai vectơ có độ dài khác nhau trong R

 measurement_date value 
1 2011-01-17 13:00:00  5 
2 2011-01-17 13:04:00  5 
3 2011-01-17 13:08:00  7 
4 2011-01-17 13:12:00  8 
5 2011-01-17 13:16:00  4 
6 2011-01-17 13:24:00  6 
7 2011-01-17 13:28:00  5 
8 2011-01-17 13:32:00  6 
9 2011-01-17 13:36:00  9 
10 2011-01-17 13:40:00  8 
11 2011-01-17 13:44:00  6 
12 2011-01-17 13:48:00  6 
13 2011-01-17 13:52:00  4 
14 2011-01-17 13:56:00  6 

Tôi có một chức năng đó sẽ xử lý các giá trị và có thể xử lý các giá trị thiếu , nhưng hàng phải ở đó vì vậy tôi đang tạo một mảng có một hàng cho mỗi phút như thế này:

times <- timeSequence(from=.., length=60, by="min") 

Bây giờ tôi có một hàng cho mỗi phút của giờ nhưng tôi cần hợp nhất dữ liệu . Tôi đã thử một cái gì đó như thế này nhưng không thể làm cho nó đúng:

lapply(times, function(time) { 
    n <- as.numeric(time) 
    v <- Position(function(candidate) { 
     y <- as.numeric(candiated) 
     n == y 
    } 

    .. insert the value into the row here .. 
} 

nhưng tôi chỉ nhận được lỗi và cảnh báo. Tôi đang đi xung quanh vấn đề đúng cách? Tôi thực sự muốn một mảng "hoàn chỉnh" với các giá trị mỗi phút vì sẽ có nhiều chức năng khác nhau sẽ được chạy các bài đọc và nó chỉ làm cho nó dễ dàng hơn để thực hiện chúng nếu họ có thể giả định rằng đó là tất cả ở đó.

+0

Cố gắng cung cấp ít nhất một ví dụ tái sản xuất như Gavin cho thấy bạn. Thêm vào đó, tôi có cảm giác bạn đang làm mọi việc quá phức tạp. Tôi không thể nghĩ ra một trường hợp mà bạn phải thêm NA cho một chức năng để làm việc. –

+0

Xem Câu hỏi thường gặp # 13 trong sở thú Hỏi đáp: http://cran.r-project.org/web/packages/zoo/vignettes/zoo-faq.pdf –

Trả lời

8
DF <- data.frame(measurement_date = seq(as.POSIXct("2011-01-17 13:00:00"), 
             as.POSIXct("2011-01-17 13:56:00"), 
             by = "mins")[seq(1, 57, by = 4)][-6], 
       value = c(5,5,7,8,4,6,5,6,9,8,6,6,4,6)) 
full <- data.frame(measurement_date = seq(as.POSIXct("2011-01-17 13:00:00"), 
              by = "mins", length = 60), 
        value = rep(NA, 60)) 

Hai cách tiếp cận có thể được sử dụng, là người đầu tiên thông qua merge:

> v1 <- merge(full, DF, by.x = 1, by.y = 1, all = TRUE)[, c(1,3)] 
> names(v1)[2] <- "value" ## I only reset this to pass all.equal later 
> head(v1) 
    measurement_date value 
1 2011-01-17 13:00:00  5 
2 2011-01-17 13:01:00 NA 
3 2011-01-17 13:02:00 NA 
4 2011-01-17 13:03:00 NA 
5 2011-01-17 13:04:00  5 
6 2011-01-17 13:05:00 NA 

Thứ hai là thông qua một biến chỉ số có nguồn gốc sử dụng %in%:

> want <- full$measurement_date %in% DF$measurement_date 
> full[want, "value"] <- DF[, "value"] 
> head(full) 
    measurement_date value 
1 2011-01-17 13:00:00  5 
2 2011-01-17 13:01:00 NA 
3 2011-01-17 13:02:00 NA 
4 2011-01-17 13:03:00 NA 
5 2011-01-17 13:04:00  5 
6 2011-01-17 13:05:00 NA 
> all.equal(v1, full) 
[1] TRUE 

Phiên bản merge là mạnh ưa thích, nhưng cần một chút công việc. Giải pháp %in% chỉ hoạt động ở đây vì dữ liệu theo thứ tự thời gian trong cả hai DFfull, do đó trước đây là "ưa thích" của tôi. Thật dễ dàng để có được/đảm bảo hai đối tượng theo thứ tự thời gian, do đó, cả hai cách tiếp cận đòi hỏi một chút khéo léo để làm việc. Chúng tôi có thể thay đổi cách tiếp cận %in% để có được cả hai biến theo thứ tự (bắt đầu lại từ đầu với full):

full2 <- data.frame(measurement_date = seq(as.POSIXct("2011-01-17 13:00:00"), 
              by = "mins", length = 60), 
        value = rep(NA, 60)) 
full2 <- full2[order(full2[,1]), ] ## get full2 in order 
DF2 <- DF[order(DF[,1]), ]   ## get DF in order 
want <- full$measurement_date %in% DF$measurement_date 
full2[want, "value"] <- DF2[, "value"] 

>  all.equal(full, full2) 
[1] TRUE 
>  all.equal(full2, v1) 
[1] TRUE 
> 
+1

Tâm trí tuyệt vời nghĩ như nhau ... :-) –

+2

Thật vậy .. (+1) "Hiệp hội đánh giá tương đối Joris-Gavin" –

+1

Giải pháp thứ hai phụ thuộc vào thứ tự hàng là chính xác. Phiên bản tốt hơn một chút sẽ là 'muốn <- match (DF $ measurement_date, full $ measurement_date)'. Nhưng có rất nhiều cạm bẫy (id trùng lặp, vv) mà giải pháp hợp nhất được ưu tiên mạnh mẽ. –

6

Trong chức năng của bạn, as.numeric (candiated) phải là as.numeric (ứng cử viên). Ngoài ra còn có một khung thiếu. Tôi không có đầu mối chính xác những gì bạn đang cố gắng đạt được trong chức năng của bạn, nhưng có vẻ phức tạp khủng khiếp với tôi.

Hãy thử

merge(Data,times,by.x=1,by.y=1,all.y=T) 

này sẽ cho bạn một cái gì đó để làm việc với.

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