【问题标题】:efficient way to create a new variable from multiple columns in R dataframe从 R 数据框中的多列创建新变量的有效方法
【发布时间】:2020-04-17 02:00:52
【问题描述】:

我正在尝试根据某些条件从一组 480 个变量中创建一个名为 DRG 的新变量,如果条件为真,则新变量是二进制变量。如果数据框中的任何列的值为 060 或 191,则 DRG =1 else 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
}

【问题讨论】:

    标签: r function matrix dplyr tibble


    【解决方案1】:

    假设您的数据框名为 df:

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

    【讨论】:

      【解决方案2】:

      您不需要为此类操作使用循环。有很多方法可以做到这一点。这里有几个。

      使用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))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多