簡體   English   中英

使用 for 和 if 根據數據框中的其他列添加列值

[英]add column values based on other columns in data frame using for and if

我有一個這樣的數據框:

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

我想使用下面的偽代碼添加其他 2 列, dse1dse2

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

但這些都行不通。

不需要使用循環,只需使用ifelse ,例如

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

不要使用 if/else。 進行矢量化,如下所示:

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

像這樣:

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

請給自己找一個好的 R 教程(比如這個)並閱讀所有關於索引向量的內容。

您可以使用transform

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

您還可以使用:

如果別的():

dat <- data.frame(id = c(2,3,4), adit = c(3,5,6),diag1 = c(4230,3345,4567), diag2 =            c(2234,4567,4467))
dat$dse1 <- ifelse(dat$diag1 == 4230,1,0)
dat$dse2 <- ifelse(dat$diag2 == 4567,1,0)
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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM