使用R从数据帧创建0和1的矩阵

时间:2018-02-03 18:43:07

标签: r

如何从数据集创建一个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)

非常感谢任何帮助,谢谢。

3 个答案:

答案 0 :(得分: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)。

答案 1 :(得分:0)

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

    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,以便{@ 1}}无需重复。我们也会删除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 s,然后使用``

将其转换为矩阵
0

答案 2 :(得分:0)

怎么样:

> 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