2013-12-13 30 views
0

我有這樣的數據:添加列和值支持算法FMP其他幾列

id  diag1 diag2 diag3 diag4 diag5 diag5 diag 6  diag7 diag8 diag9 

26 V3000 75261 V053 V290         
23 V3001 75261 V053          
24 V3000 75537 75567 V053         
19 V3001 7503 7613 7746 7631 7560 V290 76529 V1819   
29 V3001 77989 7470 7852 V053        
31 V3000 75261 79415 77989 V053        
33 V3000 7700 75329 7705 7750 7706 77089 7746 7661 75251  
20 V3000 7530 7795 76529 V053 V183       
17 V3000 75329 7788 V053         
22 4659 7862 7455 V7285        
21 V3000 7503 77181 7579 7560 75251      
30 V3000 7470 V053          
27 V3000 76519 7470 7726 7746 76719 76528 V053 V502  

我想補充VAR D1-D40,其值是基於:

如果從DIAG1到diag9有' 75261' ,則D1 = 1,否則D1 = 0

如果從DIAG1到diag9有 '7700',那麼D2 = 1,否則D2 = 0

如果從DIAG1到diag9有 '7613' '75329',那麼D3 = 1 else d3 = 0

如果從DIAG1到diag9有 '7470', '7746',那麼D4 = 1e中; SE D4 = 0 等

我使用的代碼是這樣

bd$d40 = 0 
for (i in ncol(bd){ 
    if (bd[,i] %in% ('75261')) {bd[,'d40'] = 1} 
} 

但他們不工作。 謝謝。

+0

幾件事情:1)缺少')'你爲'聲明。 2)你的'in'陳述的順序是錯誤的。也許你打算做'ifelse'和'=='? 3)你的循環將每次迭代改變整個'd40'列。這是沒有意義的。 –

+0

嗨,歡迎來到SO!因爲你是新來的,請花些時間閱讀[**關於Stackoverflow **](http://stackoverflow.com/about)和[**當某人回答**時該怎麼辦](http:// stackoverflow .COM /幫助/人,答案)。乾杯。 – Henrik

回答

0

我仍然記得啊哈,那一刻,我意識到,SAS表達式都有一個隱含的for循環會(僅在當前數據集)運行當他們被執行。可以構建R代碼來執行相同的操作,但需要顯式範圍的行才能正確地執行矢量化,並且需要對工作區中所有項目中的特定目標集合進行適當的分配。

,這將可能會得到一個你的for循環正常工作:

bd$d40 = 0 
for (i in 2:10) { 
    bd$d40 <- ifelse (bd[,i] %in% '75261', 1, bd$d40) 
} 

你真的不想說for(i in ncol(bd)),因爲列的數量在不斷增長。而且您確實需要使用列嚮導函數ifelse而不是if。如果R中的「如果」實際上是兩種不同的構建體,而在SAS和SPSS中,它是一種面向列的構建體,其中R類似物是ifelse而不是if。另外請注意,我沒有用ifelse覆蓋之前的1值(除了我的第一篇文章沒有做)。

R還鼓勵您編寫對數據對象進行操作的函數。在你的情況下,你想對一個列塊應用一個測試,並得到一個面向行的答案,這樣你就可以用R函數pmax的模擬封裝該行爲,該函數返回一個面向列的最大值(儘管我再次讀到你也可以說這是面向行的,反正這是很好的列的塊,因爲它通過行做它的計算):你的代碼錯誤

pany <- function(df, items)) { # edited to allow match for > 1 item 
        apply(df, 1, function(row) length(intersect(row , items)) >= 1)} 
    pany(bd[,2:10], '75261') 
[1] TRUE TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE 
[12] FALSE FALSE 
bd$d40 <- as.numeric(pany(bd[,2:10], '75261')) 
bd$d40 
[1] 1 1 0 0 0 1 0 0 0 0 0 0 0 
+0

謝謝。但結果不正確 – user1582755

+0

對不起,我糾正的代碼不好的複製。 –

+0

謝謝。代碼對於一個代碼是非常好的,但對於許多代碼來說不是很好,例如目標在c('7356','7500','550')中。我的意思是col 2:9,如果他們有任何一個代碼,d40將會是1 – user1582755

1

這聽起來像你試圖確定一個給定的行是否包含一個特定的ID。你會用apply()函數做到這一點:

d1 <- apply(bd, 1, function(x) as.numeric("75261" %in% x)) 
d2 <- apply(bd, 1, function(x) as.numeric("7700" %in% x)) 
... 
+0

如果d3可能有許多代碼,bd $ d3 < - 應用(bd,1,function(x)as。數字(c(「7700」,「7470」)%in%x))不起作用 – user1582755

+0

如果要檢查兩行代碼是否在每行中,則需要bd $ d3 < - apply(bd,1,function x)as.numeric(「%x」中的「7700」%以及%x中的「7470」%))。如果你想檢查是否有任何一個在行中,你需要bd $ d3 < - apply(bd,1,function(x)as.numeric(%77x%「| 7470」%in%x) ) – josliber

+0

謝謝。這很棒。我想檢查一行中的一個,還是多個代碼中的一個(例如總共10個)。有比|更好的嗎?對於許多(10)代碼 – user1582755

相關問題