2013-07-01 31 views
7

Giả sử tôi đã một data.frame như sau:Đặt cờ nếu một cột giá trị được phù hợp với những người trong vector khác

a <- data.frame(id=c(1,3,4,5,7,8,9,6,54,3,5,6,87,6)) 

Và tôi có một vector temp như sau:

temp<-c(1,3,5,9) 

Bây giờ , Tôi muốn tạo cột mới flag trên data.frame của tôi, nơi nó phải là 1 trong đó id nằm ở temp0 ở nơi khác. Đây là những gì tôi đã thử:

a$flag <- ifelse(a$id==temp, 1, 0) 

và sản lượng mong muốn phải là (1,1,0,1,0,0,1,0,0,1,1,0,0,0).

Nhưng từ mã của tôi ở trên, flag không được cập nhật đúng cách. Tôi đang thiếu gì ở đây? Tôi có thể sử dụng %in% không? Nếu vậy, làm thế nào?

Cảm ơn bạn đã giúp đỡ

+2

+1, chào mừng bạn đến với SO. Tuy nhiên, đây có vẻ là một câu hỏi khá cơ bản. Tôi đề nghị bạn tìm kiếm SO trước khi đăng. – Arun

+0

'ifelse' không hoạt động do tái chế do độ dài khác nhau của vectơ của bạn. –

Trả lời

4

Tôi nghĩ rằng đây là những gì bạn đang tìm kiếm. Có một vài vấn đề trong cách bạn đang làm data.frame của bạn:

a <- data.frame(id = c(1,3,4,5,7,8,9,6,54,3,5,6,87,6), 
       flag = 0) 

Sau đó, để cập nhật giá trị của flag tới 1 nơi id là trong temp, bạn có thể chỉ những giá trị sử dụng [ và kiểm tra logic %in%, và gán chúng 1

a$flag[a$id %in% temp] <- 1 

a 
# id flag 
# 1 1 1 
# 2 3 1 
# 3 4 0 
# 4 5 1 
# 5 7 0 
# 6 8 0 
# 7 9 1 
# 8 6 0 
# 9 54 0 
# 10 3 1 
# 11 5 1 
# 12 6 0 
# 13 87 0 
# 14 6 0 
+0

Perfecto! Tôi không biết tại sao ifelse didnt làm việc mặc dù. Cảm ơn rất nhiều !! –

+1

@carlwhyte, hãy thử chạy 'a $ id == temp' và cố gắng hiểu những gì đã xảy ra (bao gồm cả thông báo cảnh báo). Gợi ý: vì 'temp' không có cùng độ dài với' a $ id', nó được * tái chế *. – Arun

+0

tôi hiểu rồi, cảm ơn Arun! –

1
a$flag <- 0 + (a$id %in% temp) 

các lý do duy nhất mà ifelse thất bại, là việc sử dụng "==" khi kiểm tra logic cần phải có được %in%.

a<- data.frame(id=c(1,3,4,5,7,8,9,6,54,3,5,6,87,6)) 
temp<-c(1,3,5,9) 

a$flag <- ifelse(a$id %in% temp, 1, 0) 

> a 
    id flag 
1 1 1 
2 3 1 
3 4 0 
4 5 1 
5 7 0 
6 8 0 
7 9 1 
8 6 0 
9 54 0 
10 3 1 
11 5 1 
12 6 0 
13 87 0 
14 6 0 

Tôi thích thể hiện các giải pháp không phải là ifelse vì tôi thấy rằng việc xây dựng khái quát các tình huống phức tạp đến chế độ kém.

+0

lý do chuyển đổi tiềm ẩn? Mọi người đã đề xuất 'as.numeric'. – flodel

+0

Phê bình hợp lệ. Mã nằm bên dưới thao tác "+" sẽ thực hiện cưỡng chế. Đó là ít tổ hợp phím hơn, nhưng có lẽ không nhanh hơn, vì sẽ có thêm một vector được tạo và tính toán. Tôi nghĩ rằng có thể hữu ích khi hiểu R chuyển đổi loại tiềm ẩn. –

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