簡體   English   中英

從 R 數據框中的多列創建新變量的有效方法

[英]efficient way to create a new variable from multiple columns in R dataframe

我正在嘗試根據某些條件從一組 480 個變量中創建一個名為 DRG 的新變量,如果條件為真,則新變量是一個二進制變量。 如果數據框中的任何列的值為 060 或 191,則 DRG =1 否則 DRG =0;

 for (i in 1:nrow(DATA_opioid)){

   for (j in 42:480)

     { if (!is.na(DATA_opioid[i,j])  {

     if ( (DATA_opioid[i,j]) == '060' | (DATA_opioid[i,j]) == '191'| (DATA_opioid[i,j+1]))==           
    '060' |(!is.na(DATA_opioid[i,j+1]))=='191')

        { 
          DATA_opioid$DRG =1
        }
      else DATA_opioid$DRG =0

       }
   }

我一直無法得到一個工作代碼,盡管當我為其中一列嘗試它時我確實成功了。 但是有 480 個變量都以前綴“RX”開頭。 任何解決此問題的有用建議都非常受歡迎。

for (i in 1:nrow(DATA_opioid)){
    if (DATA_opioid$RX1CAT1[i]  == "060" | DATA_opioid$RX1CAT1[i] == "191"){

    DATA_opioid$DRG[i] =1 

}
else DATA_opioid$DRG[i] =0
}

您不需要為此類操作使用循環。 有很多方法可以做到這一點。 這里有幾個。

使用rowSums

df$DRG <- +(rowSums(df == '191' | df == '060') > 0)

#    a   b DRG
#1   1   2   0
#2   2   3   0
#3   3   4   0
#4   4 060   1
#5   5   3   0
#6 191   4   1

使用apply

df$DRG <- +(apply(df == '191' | df == '060', 1, any))

我們也可以在dplyr鏈中使用rowSums

library(dplyr)
df %>% mutate(DRG = +(rowSums(. == '191' | . == '060') > 0))

如果您只想在某些列上進行測試,則對上述解決方案中的這些列的數據框進行子集化。 例如要測試第 3 到 5 列,您可以執行

df$DRG <- +(apply(df[3:5] == '191' | df == '060', 1, any))

數據

對此數據進行了測試:

df <- data.frame(a = c(1:5, 191), b = c(2:4, '060', 3:4))

假設您的數據框稱為 df:

DRG<-apply(df,1,function(x){
  max(x == "060" | x == 191)
})

暫無
暫無

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

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