我的数据如下所示:
ID Diagnosis_1 Diagnosis_2 Diagnosis_3 Diagnosis_4
A 1 0 0 0
A 1 0 0 0
A 1 0 0 0
B 0 1 0 0
C 0 0 0 1
C 0 1 0 0
D 0 0 0 1
E 0 0 1 0
E 0 1 0 0
E 0 0 1 0
Run Code Online (Sandbox Code Playgroud)
Diagnosis_1:Diagnosis_4都是二元的,表示诊断的存在(1)或不存在(0).我想要做的是创建一个如下所示的数据框:
ID Diagnosis
A 1
A 1
A 1
B 2
C 4
C 2
D 4
E 3
E 2
E 3
Run Code Online (Sandbox Code Playgroud)
无论我阅读有关reshape/reshape2/tidyr的文档多少次,我都无法绕过他们的实现.
我可以使用dplyr的mutate来解决我的问题,但这是一个耗时,迂回的方式来实现我的目标.
编辑:编辑的数据更真实地代表我的实际数据框架.
尝试矩阵乘法:
nc <- ncol(DF)
data.frame(ID = DF$ID, Diagnosis = as.matrix(DF[-1]) %*% seq(nc-1))
Run Code Online (Sandbox Code Playgroud)
赠送:
ID Diagnosis
1 A 1
2 B 2
3 C 2
4 D 4
5 E 3
Run Code Online (Sandbox Code Playgroud)
注意:我们使用它作为输入:
Lines <- "ID Diagnosis_1 Diagnosis_2 Diagnosis_3 Diagnosis_4
A 1 0 0 0
B 0 1 0 0
C 0 1 0 0
D 0 0 0 1
E 0 0 1 0"
DF <- read.table(text = Lines, header = TRUE)
Run Code Online (Sandbox Code Playgroud)