2011-12-08 40 views
7

tôi có các cột sau trong tập dữ liệu của tôi:Tạo một biến mới từ một bảng tra cứu

presult  aresult 
    I   single 
    I   double 
    I   triple 
    I   home run 
    SS  strikeout 

Tôi muốn thêm một cột thứ ba "căn cứ" đó là phụ thuộc vào giá trị của các kết quả trong cột một kết quả.

Ví dụ: tôi muốn căn cứ là 1 cho một đĩa đơn, 2 cho gấp đôi, 3 cho gấp ba, 4 cho lượt chạy nhà và 0 cho một lần tấn công.

Thông thường tôi sẽ tạo ra biến mới như thế này:

dataset$base<-ifelse(dataset$aresult=="single", 1, 0) 

Vấn đề là tôi không biết làm thế nào để mã hóa các biến mới trong mà không cần cài đặt tất cả các biến số khác không.

Trả lời

14

xác định bảng tra cứu của bạn

lookup= data.frame( 
     base=c(0,1,2,3,4), 
     aresult=c("strikeout","single","double","triple","home run")) 

sau đó sử dụng tham gia từ plyr

dataset = join(dataset,lookup,by='aresult') 
+0

tiết kiệm hơn một chút so với giải pháp từ Dieter nhưng với điều này bạn có thể linh hoạt để xác định bản đồ aresult-> base. – LouisChiffre

1
dataset$base <- as.integer(as.factor(dataset$aresult)) 

Tùy thuộc vào dữ liệu as.factor() của bạn có thể bị bỏ qua, vì trong nhiều trường hợp chuỗi là yếu tố theo mặc định, ví dụ: với read.table

+0

Làm thế nào tôi có thể xác định những gì giá trị mỗi kết quả mất? –

+0

Cách tiếp cận tốt đẹp, nhưng để làm việc này, "đình công" cần phải là người đầu tiên trong danh sách, và sau đó bạn phải trừ 1. – Andrie

+0

@burton giải pháp của tôi cho phép bạn làm điều đó – LouisChiffre

13

Dưới đây là làm thế nào để sử dụng một vector đặt tên theo tra cứu:

Xác định dữ liệu thử nghiệm :

dat <- data.frame(
    presult = c(rep("I", 4), "SS", "ZZ"), 
    aresult = c("single", "double", "triple", "home run", "strikeout", "home run"), 
    stringsAsFactors=FALSE 
) 

Xác định một vector số tên với điểm số:

score <- c(single=1, double=2, triple=3, `home run`=4, strikeout=0) 

Sử dụng lập chỉ mục vector để phù hợp với điểm số so với kết quả:

dat$base <- score[dat$aresult] 
dat 
    presult aresult base 
1  I single 1 
2  I double 2 
3  I triple 3 
4  I home run 4 
5  SS strikeout 0 
6  ZZ home run 4 

thông tin bổ sung:

Nếu bạn không muốn để tạo vectơ có tên bằng tay, hãy nói trong trường hợp bạn có lượng dữ liệu lớn, hãy thực hiện như sau:

scores <- c(1:4, 5) 
names(scores) <- c("single", "double", "triple", "home run", "strikeout") 

(Hoặc đọc các giá trị và tên từ dữ liệu hiện có. Vấn đề là để xây dựng một vector số và sau đó gán tên)

+0

mẹo hay để sử dụng vectơ có tên. Tôi đã học được điều gì đó ở đây. – LouisChiffre

+2

+1 Ý tưởng tuyệt vời để sử dụng một vector có tên. Ước gì tôi đã thấy/suy nghĩ của những năm trước đây! –

+0

@Andrie. Có cách nào để làm điều này mà không cần phải xác định các hàng.Tôi có một tập dữ liệu với hàng ngàn hàng. –

2

Một thay thế cho Dieter's answer:.

dat <- data.frame(
    presult = c(rep("I", 4), "SS", "ZZ"), 
    aresult = c("single", "double", "triple", "home run", "strikeout", "home run"), 
    stringsAsFactors=FALSE 
) 

dat$base <- as.integer(factor(dat$aresult, 
    levels=c("strikeout","single","double","triple","home run")))-1 
Các vấn đề liên quan