2011-04-19 26 views
11

Giả sử chúng ta có một dataframeLàm cách nào để tạo biến mới trong data.frame dựa trên điều kiện?

x y 
1 1 
2 4 
4 5 

làm thế nào bạn có thể thêm một biến mới cho dataframe ví dụ rằng nếu x là nhỏ hơn hoặc bằng 1 nó sẽ trả về "tốt" nếu x là từ 3 đến 5 nó sẽ trả về " xấu "else returns" fair "

x y w 
1 1 "good" 
2 2 "fair" 
5 5 "bad" 

Áp dụng phương pháp được hiển thị bằng ocram. Tuy nhiên, phương pháp này không hoạt động.

d1 <- c("e", "c", "a") 
d2 <- c("e", "a", "b") 

w <- ifelse(d1 == "e" & (d2=="e"), 1, ifelse((d1 == "a") & (d2 =="b"), 2, ifelse(d1 == "e"),3,99)) 

Mọi ý tưởng? Cảm ơn

+1

Nhìn vào chức năng 'cut' – hadley

+0

Mã cuối cùng của bạn không hoạt động vì bạn đã nhầm lẫn các dấu ngoặc đơn; nó phải luôn luôn 'ifelse (cond, ifTrue, ifFalse)', không bao giờ 'ifelse (cond) ifTrue, ifFalse'. – mbq

+0

Cảm ơn! ghi chú như vậy .. :) – eastafri

Trả lời

17

Một khả năng rõ ràng và đơn giản là sử dụng "các điều kiện if-else". Trong ví dụ đó

x <- c(1, 2, 4) 
y <- c(1, 4, 5) 
w <- ifelse(x <= 1, "good", ifelse((x >= 3) & (x <= 5), "bad", "fair")) 
data.frame(x, y, w) 

** Đối với câu hỏi bổ sung trong chỉnh sửa ** Đó có phải là những gì bạn mong đợi không?

> d1 <- c("e", "c", "a") 
> d2 <- c("e", "a", "b") 
> 
> w <- ifelse((d1 == "e") & (d2 == "e"), 1, 
+ ifelse((d1=="a") & (d2 == "b"), 2, 
+ ifelse((d1 == "e"), 3, 99))) 
>  
> data.frame(d1, d2, w) 
    d1 d2 w 
1 e e 1 
2 c a 99 
3 a b 2 

Nếu bạn không cảm thấy thoải mái với những ifelse chức năng, bạn cũng có thể làm việc với các ifelse báo cáo cho các ứng dụng như vậy.

+0

Cảm ơn một tấn, tuy nhiên cách tiếp cận này chỉ giới hạn ở 2 điều kiện? xem câu hỏi đã chỉnh sửa ở trên – eastafri

+1

Tôi đã chỉnh sửa câu trả lời của mình – Marco

3

Nếu bạn có số lượng giới hạn các cấp, bạn có thể thử chuyển đổi y thành nhân tố và thay đổi cấp độ của nó.

> xy <- data.frame(x = c(1, 2, 4), y = c(1, 4, 5)) 
> xy$w <- as.factor(xy$y) 
> levels(xy$w) <- c("good", "fair", "bad") 
> xy 
    x y w 
1 1 1 good 
2 2 4 fair 
3 4 5 bad 
Các vấn đề liên quan