【问题标题】:Create a matrix of 0's and 1's from a data frame using R使用 R 从数据框中创建一个由 0 和 1 组成的矩阵
【发布时间】:2018-02-03 18:43:06
【问题描述】:

如何从一个数据集中创建一个由 0 和 1 组成的矩阵,其中三列分别标记为 hosp(即医院)、pid(即患者 ID)和治疗,如下所示

df<-
structure(list(
hosp=c(1L,1L,1L,1L,1L,1L,2L,2L,2L),
pid=c(1L,1L,1L,2L,3L,3L,4L,5L,5L),
treatment=c(0L,0L,0L,1L,1L,1L,0L,1L,1L)
),
.Names=c("hosp","pid","treatment"),
class="data.frame",row.names=c(NA,-9))

矩阵的行和列应该分别是观察次数(在本例中为 9)和唯一的医院数。矩阵中的条目应该是治疗值,也就是说,如果相应的患者在该医院接受治疗 1,则该医院为 1,否则为 0。矩阵应该看起来像

matrix(c(0,0,
0,0,
0,0,
1,0,
1,0,
1,0,
0,0,
0,1,
0,1),nrow=9,byrow=TRUE)

任何帮助将不胜感激,谢谢。

【问题讨论】:

    标签: r


    【解决方案1】:

    1)hosp 创建一个模型矩阵作为没有截距项的因子,并将其乘以treatment

    hosp <- factor(df$hosp)
    model.matrix(~ hosp + 0) * df$treatment
    

    给予:

      hosp1 hosp2
    1     0     0
    2     0     0
    3     0     0
    4     1     0
    5     1     0
    6     1     0
    7     0     0
    8     0     1
    9     0     1
    attr(,"assign")
    [1] 1 1
    attr(,"contrasts")
    attr(,"contrasts")$hosp
    [1] "contr.treatment"
    

    2) outer(hosp, unique(hosp), "==")hosp 的模型矩阵,除了使用 TRUE/FALSE 代替 1/0。乘以treatment

    with(df, outer(hosp, unique(hosp), "==") * treatment)
    

    给予

          [,1] [,2]
     [1,]    0    0
     [2,]    0    0
     [3,]    0    0
     [4,]    1    0
     [5,]    1    0
     [6,]    1    0
     [7,]    0    0
     [8,]    0    1
     [9,]    0    1
    

    更新:添加 (1) 和简化 (2)。

    【讨论】:

      【解决方案2】:

      这是我的解决方法。不是最干净的,但它有效!

          require(dplyr)
      
      df2 <- df %>% 
        mutate(x = row_number()) %>% 
        select(-pid) %>% 
        spread(x, treatment)
      
      df3 <- df2 %>% 
        gather("keys", "value", 2:10) %>% 
        spread(hosp, value) %>% 
        select(-keys)
      
      df3[is.na(df3)] <- 0
      df3 <- as.matrix(df3)
      

      一步一步:

      获取原始的df 并为其添加一个row_number,这样我们就可以spread 而不会重复。我们还将删除 pid,因为您要将其更改为矩阵。

          require(dplyr)
      
      df2 <- df %>% 
        mutate(x = row_number()) %>% 
        select(-pid) %>% 
        spread(x, treatment)
      

      然后我们想把它改回长格式:

      df3 <- df2 %>% 
        gather("keys", "value", 2:10) %>% 
        spread(hosp, value) %>% 
        select(-keys)
      

      有些值还是NA,所以我们把它们转换成0s,然后用``

      把它变成一个矩阵
      df3[is.na(df3)] <- 0
      df3 <- as.matrix(df3)
      
        1 2
      1 0 0
      2 0 0
      3 0 0
      4 1 0
      5 1 0
      6 1 0
      7 0 0
      8 0 1
      9 0 1
      

      【讨论】:

        【解决方案3】:

        怎么样:

        > sapply(unique(df$hosp),function(x) ifelse(df$hosp==x&df$treatment==1,1,0))
              [,1] [,2]
         [1,]    0    0
         [2,]    0    0
         [3,]    0    0
         [4,]    1    0
         [5,]    1    0
         [6,]    1    0
         [7,]    0    0
         [8,]    0    1
         [9,]    0    1
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-17
          • 1970-01-01
          • 2023-04-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多