2012-06-08 28 views
10

Vì vậy, tôi có một khung dữ liệu với hai yếu tố và một biến số như sau:Xử lý thiếu sự kết hợp của các yếu tố trong R

>D 
f1 f2 v1 
1 A 23 
2 A 45 
2 B 27 
    . 
    . 
    . 

quá mức f1 là 1 và 2 và mức f2 là A và B. Đây là điều, không có giá trị đầu vào cho khi f1 = 1 và f2 = B (đó là D $ V1 [D $ f1 = 1 & D $ f2 = B] không có) trong thực tế này nên được số không.

Trong khung dữ liệu thực tế, tôi có 11 cấp độ f1 và gần 150 cấp f2 và tôi cần tạo quan sát với v1 = 0 cho mọi kết hợp f1 và f2 bị thiếu trong khung dữ liệu của tôi.

Tôi làm cách nào để thực hiện việc này?

Cảm ơn trước,

Ian

Trả lời

11

Sử dụng dữ liệu của bạn:

dat <- data.frame(f1 = factor(c(1,2,2)), f2 = factor(c("A","A","B")), 
        v1 = c(23,45,27)) 

một lựa chọn là tạo ra một bảng tra cứu với sự kết hợp của các cấp, được thực hiện bằng cách sử dụng expand.grid() chức năng cung cấp với các cấp của cả hai yếu tố, như được hiển thị bên dưới:

dat2 <- with(dat, expand.grid(f1 = levels(f1), f2 = levels(f2))) 

Một cơ sở dữ liệu giống như tham gia hoạt động sau đó có thể được thực hiện bằng cách sử dụng merge() chức năng trong đó chúng ta xác định rằng tất cả các giá trị từ các bảng tra cứu có trong tham gia (all.y = TRUE)

newdat <- merge(dat, dat2, all.y = TRUE) 

Dòng trên sản xuất:

> newdat 
    f1 f2 v1 
1 1 A 23 
2 1 B NA 
3 2 A 45 
4 2 B 27 

Như bạn có thể thấy, các kết hợp bị thiếu được cung cấp giá trị NA cho biết số thiếu. Đó là realtively đơn giản để sau đó thay thế các NA s với 0 s:

> newdat$v1[is.na(newdat$v1)] <- 0 
> newdat 
    f1 f2 v1 
1 1 A 23 
2 1 B 0 
3 2 A 45 
4 2 B 27 
+0

@ user1443010 trong dòng đó, tôi đang sử dụng nó để tránh 'dat $ f1' và' dat $ f2'. Tôi cũng nghĩ rằng nó làm cho ý định rõ ràng; bằng cách sử dụng * đối tượng * này, làm * đó *. Không có gì sai với điều này ở cấp độ người dùng, nhưng có một hình phạt hiệu quả khi R phải tạo ra một môi trường mới với nội dung của đối tượng và cần có thời gian. 'dat2 <- expand.grid (f1 = levels (dat $ f1), f2 = levels (dat $ f2))' sẽ là phương án thay thế. Bạn không thể luôn làm việc với 'with()'; Tôi không nghĩ rằng dòng thay thế 'NA' có thể dễ dàng được chuyển thành một' với() ', nhưng tôi có thể thiếu một cái gì đó. –

+0

tuyệt vời! cảm ơn! ;) – maycca

1

Hai năm cuối, nhưng tôi đã có cùng một vấn đề và đưa ra giải pháp này plyr:

dat <- data.frame(f1 = factor(c(1,2,2)), f2 = factor(c("A","A","B")), v1 = c(23,45,27)) 

newdat <- ddply(dat, .(f1,f2), numcolwise(function(x) {if(length(x)>0) x else 0.0}), .drop=F) 

> newdat 
    f1 f2 v1 
1 1 A 23 
2 1 B 0 
3 2 A 45 
4 2 B 27 
2

tôi thêm các tidyr giải pháp, trải rộng với fill=0 và thu thập.

library(tidyr) 
df %>% spread(f2, v1, fill=0) %>% gather(f2, v1, -f1) 

# f1 f2 v1 
#1 1 A 23 
#2 2 A 45 
#3 1 B 0 
#4 2 B 27 

Bạn cũng có thể làm như nhau df %>% spread(f1, v1, fill=0) %>% gather(f1, v1, -f2).

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