首页 > 解决方案 > 全国住院样本的 if 和 for 声明

问题描述

我有一个数据集,附上。它有 16 列。
第一列显示患者是否进行了手术,其他15个是手术的第1-15天(编码为1、0)。
我想创建一个满足一些条件的新列。我希望该列显示程序的确切日期。
例如,如果列Day3的值为 1,我希望新列中的新值为 3(当且仅当第一列craniPRDAY3列的值为 1 时),依此类推以应用于所有天' 列(第 1-15 天)。

非常感谢您的帮助。如果您对数据集或我要解决的问题有任何疑问,请告诉我。

tts <- function(timedc){
 for (i in 15) {
   if (TBI$PRDAYi == "1"){
     timedc = c(timedc, TBI$PRDAYi)
   } 
   return(timedc)  
 }
 
 for (i in TBI$crani){
   if (TBI$crani == "1"){
     tts
   }
 }
}

*当 tts 是时候进行手术了。

我收到此错误消息:

if (TBI$crani == "1") { 中
的警告:条件长度 > 1 并且仅使用第一个元素

我想创建一个列,该列具有来自该数据库的过程的确切日期,如上所述。
下面的数据集。

> dput(TBI[1:10, 1:6])
structure(list(TBI.crani = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0), TBI.PRDAY1 = c(NA, 
0, NA, NA, 1, NA, 0, 0, 0, 1), TBI.PRDAY2 = c(NA, 2, NA, NA, 
11, NA, NA, 0, 16, 2), TBI.PRDAY3 = c(NA, 2, NA, NA, 0, NA, NA, 
0, 0, 2), TBI.PRDAY4 = c(NA, NA, NA, NA, 9, NA, NA, NA, 0, 5), 
    TBI.PRDAY5 = c(NA, NA, NA, NA, 11, NA, NA, NA, 0, 1)), row.names = c(NA, 
-10L), class = c("tbl_df", "tbl", "data.frame"))

在此处输入图像描述

标签: r

解决方案


我相信以下功能可以满足问题的要求。对于发布的数据,它返回一个零向量,因为第一列TBI.crani始终为零。

tts <- function(data){
  f <- function(x){
      if(all(is.na(x))) 
        NA_integer_ 
      else {
        w <- which(x == 1)
        if(length(w)) w[1] else 0L
      }
  }  
  crani <- grep("crani", names(data))
  day_cols <- grep("DAY", names(data))
  apply(data, 1, function(x){
    if(x[crani] == 1) f(x[day_cols]) else 0L
  })
}

tts(TBI)
TBI$NEW <- tts(TBI)

推荐阅读