根据其他几列添加列及其值

时间:2013-12-13 16:04:38

标签: r

我有这样的数据:

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否则d3 = 0

如果从diag1到diag9有'7470','7746'则d4 = 1 e; se d4 = 0 等

我使用了这样的代码

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

但他们没有工作。 感谢。

2 个答案:

答案 0 :(得分: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))
...

答案 1 :(得分: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中的“If”实际上是两种不同的构造,而在SAS和SPSS中,它是一种面向列的构造,R模拟为ifelse而不是if。另请注意,我没有使用1覆盖之前的ifelse - 值(除了我的第一个帖子之外)。

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