15

次のようなデータフレームがあります。

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

他の 2 つの列を追加し、以下の疑似コードを使用し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} 
  }
}

しかし、これらは機能しません。

4

6 に答える 6

25

ループを使用する必要はありませんifelse。たとえば、を使用するだけです

dse = within(dse, {
    dse1 = ifelse(diag1 == 4230, 1, 0)
    dse2 = ifelse(diag2 == 4567, 1, 0)
 })
于 2013-01-07T18:48:32.227 に答える
13

if/else を使用しないでください。次のようにベクトル化します。

dat$dse1 <- as.numeric(dat$diag1 == 4230)
dat$dse2 <- as.numeric(dat$diag2 == 4567)
于 2013-01-07T18:47:42.270 に答える
5

このような:

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

優れた R チュートリアル (この など) を入手して、インデックスベクトルについてすべて読んでください。

于 2013-01-07T18:50:41.123 に答える
4

使用できますtransform

transform(dse, dse1 = as.numeric(diag1 == 4230),
               dse2 = as.numeric(diag2 == 4567))
于 2013-01-07T18:49:05.403 に答える
0

を使用したソリューション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))
于 2020-01-15T15:50:09.800 に答える