【问题标题】:R long to wide format factor levels as binary variables and datesR 长到宽格式因子级别作为二进制变量和日期
【发布时间】:2018-11-30 09:45:57
【问题描述】:

我想将 long 转换为宽格式并将因子 Levels 用作二进制变量。这意味着,如果因子 Level 至少存在一次,那么变量中应该有 1。否则为 0。此外,我希望将日期作为变量值 date.1、date.2、...

我拥有的是以下

data_sample <- data.frame(
  PatID  = c(1L, 1L, 1L, 2L, 2L, 3L, 3L, 3L, 3L),
  date   = c("2016-12-14", "2017-02-04", "NA", "NA", "2012-27-03", "2012-04-21", "2010-02-03", "2011-03-05", "2014-08-25"),
  status = c("COPD", "CPOD", "NA", "NA", "Cardio", "CPOD", "Cardio", "Cardio", "Cerebro")
)

我想要的是:

PatID  COPD Cardio Cerebro date.COPD.1 date.COPD.2 date.Cardio.1  date.Cardio.2  date.Cerebro.1
1        1    0       0    2016-12-14  2017-02-04     NA               NA          NA
2        0    1       0      NA           NA        2012-03-27         NA          NA 
3        1    1       1    2012-04-21     NA        2010-02-03    2011-03-05      2014-08-25      

【问题讨论】:

    标签: r format reshape dcast spread


    【解决方案1】:

    需要采取一些步骤,但这应该会为您提供所需的输出。

    但是请注意,输入数据中似乎有一个错字:我假设您的意思是 "COPD" 而不是 "CPOD",因为这是您预期的输出告诉我的。

    第一步是使字符串"NA"成为一个明确的缺失值,即NA

    data_sample[data_sample == "NA"] <- NA
    

    现在使用data.table::dcast 进行整形。

    library(data.table)  
    setDT(data_sample)
    
    # create id column
    data_sample[, id := rowid(status), by = PatID]
    dt1 <- dcast(data_sample[!is.na(date)], PatID ~ status, fun.aggregate = function(x) +any(x))
    dt2 <- dcast(data_sample[!is.na(date)], PatID ~ paste0("date_", status) + id, value.var = "date")
    

    最后加入两个data.tables

    out <- dt1[dt2, on = 'PatID']
    out
    #  PatID Cardio Cerebro COPD date_COPD_1 date_COPD_2 date_Cardio_1 date_Cardio_2 date_Cerebro_1
    #1:     1      0       0    1  2016-12-14  2017-02-04          <NA>          <NA>           <NA>
    #2:     2      1       0    0        <NA>        <NA>    2012-27-03          <NA>           <NA>
    #3:     3      1       1    1  2012-04-21        <NA>    2010-02-03    2011-03-05     2014-08-25
    

    数据

    data_sample <- data.frame(
      PatID   = c(1L, 1L, 1L, 2L, 2L, 3L, 3L, 3L, 3L),
      date = c("2016-12-14", "2017-02-04", "NA", "NA", "2012-27-03", "2012-04-21", "2010-02-03", "2011-03-05", "2014-08-25"),
      status =c("COPD", "COPD", "NA", "NA", "Cardio", "COPD", "Cardio", "Cardio", "Cerebro"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多