如何在R中创建一个填充了1和0的表,以显示另一个表中值的存在?

时间:2018-07-19 17:36:39

标签: r tidyr spread

我正在处理有关人们以及他们开什么药的数据。看起来像这样(实际数据通过txt文件读取):

test <- matrix(c(1,"a",1,"a",1,"b",2,"a",2,"c"),ncol=2,byrow=TRUE)
colnames(test) <- c("id","med")
test <- as.data.table(test)
test <- unique(test[, 1:2])
test

该表包含约500万行,4.5万名独特患者和49种独特药物。有些患者有多种相同的药物,我将其删除。并非所有患者都有每种药物。我想将49种独特的药物中的每一种划分为单独的列,并让每个独特的患者排成一行,并在表格中填充1和0,以显示患者是否有药物。

我试图使用传播或dcast,但没有值列。我试图通过添加1s来对此进行修改

test$true <- rep(1, nrow(test))

然后使用提迪尔

library(tidyr)
test_wide <- spread(test, med, true, fill = 0)

我的原始数据产生了此错误,但我不确定为什么新数据无法再现...

Error: `var` must evaluate to a single number or a column name, not a list

请让我知道我可以做些什么来使它成为更好的可重现示例,对不起,我真的是新来的。

2 个答案:

答案 0 :(得分:0)

使用dplyr

的另一种解决方案
library(dplyr)
test %>% group_by(id) %>% table()

答案 1 :(得分:-1)

您似乎在这里尝试进行onehot编码。为此,请参考“ onehot”软件包。详细信息为here

参考代码:

[^>]+

确保要编码的所有列均为library(onehot) test <- matrix(c(1,"a",1,"a",1,"b",2,"a",2,"c"),ncol=2,byrow=TRUE) colnames(test) <- c("id","med") test <- as.data.frame(test) str(test) test$id <- as.numeric(test$id) str(test) encoder <- onehot(test) finaldata <- predict(encoder,test) finaldata 类型。另外,我也自由地将factor更改为data.table