2013-01-07 40 views
10

Tôi có một dataframe như thế này:thêm giá trị cột dựa trên các cột khác trong khung dữ liệu sử dụng cho và nếu

 id  adit  diag1 diag2  
     2  3   4230 2234   
     3  5   3345 4456   
     4  6   4567 4467 

Tôi muốn thêm 2 cột khác, dse1dse2 sử dụng pseudo-code dưới đây:

if diag1 contains 4230 then dse1 = 1 else dse1 = 0 

if diag2 contains 4567 then dse2 =1 else dse2 = 0 

tôi sử dụng này:

for (i in 1 : nrow(dse)){ 
    for (j in 3: ncol(dse)){ 
    if dse[i,j] %in% ("4320"){dse$dse1 = 1} 
     else{dse$dse1 = 0} 
    if dse[i,j] %in% ("4567"){dse$dse2 = 1} 
     else{dse$dse2 = 0} 
    } 
} 

Nhưng những làm không t làm việc.

+0

Tất cả các câu trả lời bên dưới là tuyến đường chính xác. Tuy nhiên, nếu bạn đang sử dụng 'if/else' thì' else cần phải nằm trên cùng một dòng với kết thúc '}' từ câu lệnh 'if' của bạn. – Justin

+0

for (i trong 1: nrow (DSE)) { for (j trong 3: ncol (DSE)) { if (DSE [i, j] == 4230) { DSE $ dse1 = 1 } khác { DSE $ dse1 = 0 } if (DSE [i, j]% trong% (4567)) {DSE $ dse2 = 1} else {DSE $ dse2 = 0} } } tôi thay đổi mã như trên, không có lỗi, nhưng kết quả là không chính xác. Tại sao? THnaks – user1582755

+0

Bạn không chắc chắn nên đưa ra nhận xét gì. Bạn có thể chỉnh sửa câu hỏi của mình nếu cần. Ngoài ra, nếu bất kỳ câu trả lời nào dưới đây đã giải quyết được vấn đề, vui lòng đánh dấu nó là đã được trả lời bằng cách nhấp vào dấu kiểm màu xanh lục của câu hỏi để chúng tôi biết nó đã được giải quyết. – Justin

Trả lời

18

Không cần phải sử dụng một vòng lặp, chỉ cần sử dụng ifelse, ví dụ

dse = within(dse, { 
    dse1 = ifelse(diag1 == 4230, 1, 0) 
    dse2 = ifelse(diag2 == 4567, 1, 0) 
}) 
+4

Tôi đã có downvote sắp tới, chỉ cần thêm một số mã ví dụ. –

+0

Cảm ơn. Các dse1 có thể có nhiều chẩn đoán, đây là, nếu dse [i, j]% trong% ("2345", "3456", "5678") {dse1 = 1). Và nếu mã có bất kỳ woring? làm thế nào để sửa chúng – user1582755

+0

Tôi không chắc chắn những gì bạn muốn, xin vui lòng thêm thông tin thêm cho câu hỏi của bạn. –

10

Không sử dụng if/else. Go vector hóa như trong:

dat$dse1 <- as.numeric(dat$diag1 == 4230) 
dat$dse2 <- as.numeric(dat$diag2 == 4567) 
+0

+1 câu trả lời hay, nếu cảm thấy rằng việc sử dụng 'ifelse' thì minh bạch hơn một chút. Ngoài ra, bạn có thể có các giá trị khác so với '0' và' 1'. –

+1

Đây chắc chắn là câu trả lời hay nhất. 'ifelse (cond, 1, 0)' không bao giờ được sử dụng. –

4

Bạn có thể sử dụng transform:

transform(dse, dse1 = as.numeric(diag1 == 4230), 
       dse2 = as.numeric(diag2 == 4567)) 
+0

Cảm ơn. Các dse1 có thể có nhiều chẩn đoán, đây là, nếu dse [i, j]% trong% ("2345", "3456", "5678") {dse1 = 1). – user1582755

4

Như thế này:

dse$dse1<-0 
dse$dse2<-0 
dse$dse1[dse$diag1==4230]<-1 
dse$dse2[dse$diag2==4567]<-1 

Hãy tự mình có một hướng dẫn R tốt (chẳng hạn như this) và đọc tất cả về vectơ chỉ mục.

+0

Cảm ơn mọi câu trả lời.Nếu chúng ta thay đổi các câu lệnh như thế này nếu diag1 OR diag2 chứa 4230 thì dse1 = 1 else dse1 = 0 nếu diag2 hoặc diag1 chứa 4567 thì dse2 = 1 else dse2 = 0 và có nhiều diags trong đó có nhiều mã, có nhiều ds. Câu trả lời gọn gàng là gì – user1582755

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