使用for和if基于数据框中的其他列添加列值

使用for和if基于数据框中的其他列添加列值,r,if-statement,for-loop,R,If Statement,For Loop,我有这样一个数据帧: id adit diag1 diag2 2 3 4230 2234 3 5 3345 4456 4 6 4567 4467 我想使用下面的伪代码添加另外两列,dse1和dse2: if diag1 contains 4230 then dse1 = 1 e

我有这样一个数据帧:

     id        adit     diag1   diag2       
      2       3         4230    2234        
      3       5         3345    4456        
      4       6         4567    4467
我想使用下面的伪代码添加另外两列,
dse1
dse2

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

if diag2 contains 4567 then dse2 =1  else dse2 = 0
我用了这个:

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} 
  }
}

但是这些都不起作用。

不要使用if/else。将矢量化,如中所示:

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

dat$dse1无需使用循环,例如,只需使用
ifelse

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

您可以使用
转换

transform(dse, dse1 = as.numeric(diag1 == 4230),
               dse2 = as.numeric(diag2 == 4567))
像这样:

dse$dse1<-0
dse$dse2<-0
dse$dse1[dse$diag1==4230]<-1
dse$dse2[dse$diag2==4567]<-1
dse$dse1您还可以使用:

ifelse():


dat使用
tidyverse的解决方案

x = data.frame(id = c(2, 3, 4), 
               adit=c(3, 5, 6), 
               diag1=c(4230, 3345, 4567), 
               diag2=c(2234, 4456, 4467))

x %>% mutate(dse1 = if_else(diag1 == 4230, 1, 0), 
             dse2 = if_else(diag2 == 4567, 1, 0))

以下所有答案都是正确的路线。但是,如果您使用的是
if/else
,那么
else需要与
if
语句中的结束符在同一行上。for(i in 1:nrow(dse)){for(j in 3:ncol(dse)){if(dse[i,j]=4230{dse$dse1=1}else{dse$dse1=0}if(dse[i,j]%in%(4567)){dse$e2=1}否则{dse$dse2=0}}}我按上述方式更改代码,没有错误,但结果不正确。为什么?我不知道该如何看待你的评论。您可以根据需要编辑您的问题。此外,如果以下任何答案已解决问题,请单击问题旁的绿色复选标记将其标记为已回答,以便我们都知道问题已解决。我知道问题,dse$dse1应为dse$dse[I],dse$dse2应为dse$dse2[I]。感谢您的帮助和回答+1个不错的答案,如果您觉得使用
ifelse
更透明一点的话。此外,您还可以使用
0
1
以外的其他值。这绝对是最好的答案
ifelse(cond,1,0)
不应使用。谢谢。dse1可能有很多诊断,这是,如果dse[i,j]%在%(“2345”,“3456”,“5678”){dse1=1)。谢谢。dse1可能有很多诊断,这是,如果dse[i,j]%在%(“2345”,“3456”,“5678”){dse1=1).如果代码有任何错误?如何更正?我不确定您想要什么,请在您的问题中添加更多信息。@用户1582755-若要针对多个匹配项调整代码,我想您只需替换上面的相应行,如:
dse1=ifelse(在%c(234545678),1,0中的diag1%
dse1=1,如果在('224'、'334',333'等中有diag1或diag2或diag3,则在('444'、'435'等)中有dse2=1)感谢所有的答案。如果我们更改这些语句,如果diag1或diag2包含4230,则dse1=1,否则dse1=0如果diag2或diag1包含4567,则dse2=1,否则dse2=0,并且有许多diags,其中有许多代码,因此有许多DSE。简洁的答案是什么s
x = data.frame(id = c(2, 3, 4), 
               adit=c(3, 5, 6), 
               diag1=c(4230, 3345, 4567), 
               diag2=c(2234, 4456, 4467))

x %>% mutate(dse1 = if_else(diag1 == 4230, 1, 0), 
             dse2 = if_else(diag2 == 4567, 1, 0))