如何从数据集创建一个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)
非常感谢任何帮助,谢谢。
答案 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