2012-09-04 69 views
8

Tôi muốn tính các phần tử mới không có trong những năm trước. Trong ví dụ nàyđếm các phần tử mới trong danh sách vector

dữ liệu mẫu:

var1 <- list('2003' = 1:3, '2004' = c(4:3), '2005' = c(6,4,1), '2006' = 1:4) 

Tôi muốn nhận được đầu ra

newcount <- list('2003' = 0, '2004' = 1, '2005' = 1, '2006' = 0) 

đang không thành công:

newcount <- mapply(setdiff, var1, seq_along(var1), function(i) 
      {if (i > 1) {Reduce(union, var1[i-1], accumulate=T)}}, length) 
+2

Vui lòng nghiên cứu thuật ngữ. Bạn có một danh sách các vectơ, không phải khung dữ liệu. – Andrie

+0

Cảm ơn @Andrie, đã sửa. – dmvianna

+1

'diff (sapply (Reduce (union, var1, accumulate = TRUE), length))' # [1] 1 1 0 –

Trả lời

5

Hầu như ở đó, nhưng nó tốt hơn để sử dụng vector lập chỉ mục để làm việc với các bù đắp và bổ sung các yếu tố ban đầu luôn nổi tiếng sau:

lapply(c(list(`2003`=integer(0)), 
     mapply(setdiff,var1[-1], 
       Reduce(union,var1,accumulate=TRUE)[-length(var1)])),length) 
$`2003` 
[1] 0 

$`2004` 
[1] 1 

$`2005` 
[1] 1 

$`2006` 
[1] 0 
+0

Trường hợp bạn thực hiện số cuộc gọi hàm tối đa trong một dòng với số đó? ;-) (Nghiêm túc, mặc dù, đó là quá mức cần thiết.) –

+0

Vâng, 80 ký tự là như vậy passé;) – James

4

Giả sử rằng var1 được sắp xếp theo năm, và năm 2003 bạn muốn 3 thay vì 1, bạn có thể thử

newcount <- lapply(seq_along(var1),function(x){ 
    prev<-unlist(var1[seq_len(x-1)]) 
# Improvement suggested by plannapus 
    sum(!var1[[x]]%in%prev) # length(which(!var1[[x]]%in%prev)) 
}) 

names(newcount)<-names(var1) 

newcount 
# $`2003` 
# [1] 3 

# $`2004` 
# [1] 1 

# $`2005` 
# [1] 1 

# $`2006` 
# [1] 0 

OK, nếu bạn hoàn toàn chắc chắn rằng năm 2003 phải là 0 (mà tôi thấy như một ngoại lệ đối với logic của bạn), sau đó bạn có thể làm như sau:

newcount <- c(0, lapply(seq_along(var1)[-1],function(x){ 
    prev<-unlist(var1[seq_len(x-1)]) 
    sum(!var1[[x]]%in%prev) 
})) 
+0

@plannapus, Đề xuất tốt. Đã thay đổi ở trên. – BenBarnes

+0

Ngoài ra, không có năm trước cho năm 2003 vì vậy nó phải là 0 nếu chúng ta đang đếm số thứ được tìm thấy trong những năm trước? –

+1

@GavinSimpson, cảm ơn nhận xét. Tôi nghĩ rằng OP muốn số lượng các yếu tố trong năm i mà không có mặt trong bất kỳ năm nào trước đó. Vì vậy, mặc dù tôi có thể hiểu có 0 cho năm 2003, nó có vẻ là một ngoại lệ cho quy tắc. Nó sẽ là một thay đổi dễ dàng, nhưng là một "mã cứng". – BenBarnes

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