我正在解决一个问题,即我有100多个项目,问题的结果包含以2 n
次为一组的100多个项目。我想为结果数据集创建一个n x 100的虚拟矩阵,用于指示项目是否在特定的“运行”中。我通常可以使用model.matrix
轻松完成此操作,但是我的结果有时并没有数据框中的每个项目,我希望这些都是0。例如:
library(dplyr)
AllIDs <- c('A', 'B', 'C', 'D', 'E', 'G', 'H')
resultID <- c('D', 'A', 'C', 'G', 'A', 'H')
resultRun <- (rep(1:3, each = 2))
resultDF <- data.frame(resultRun, resultID, stringsAsFactors = F)
modelMat <- model.matrix(~resultDF$resultID)
dummyDF <- resultDF %>%
# group_by(resultRun) %>%
mutate(A = ifelse(resultID == 'A', 1, 0),
B = ifelse(resultID == 'B', 1, 0),
C = ifelse(resultID == 'C', 1, 0),
D = ifelse(resultID == 'D', 1, 0),
E = ifelse(resultID == 'E', 1, 0),
G = ifelse(resultID == 'G', 1, 0),
H = ifelse(resultID == 'H', 1, 0)) %>%
group_by(resultRun) %>%
summarise(A = sum(A),
B = sum(B),
C = sum(C),
D = sum(D),
E = sum(E),
G = sum(G),
H = sum(H))
请注意,即使我将modelMat
的截距清除为A
的虚拟向量,它仍然缺少B
,因为B
不在结果中。 dummyDF
正是我想要的样子,但这个过程过于繁琐。我的实际问题有100多个“ID”,而且它们经常每分钟都在变化。我无法不断更新管道以包含不同的项目。
我想使用一个函数,为dummyDF
中的每个输入返回带有虚拟向量的AllIDs
。任何帮助将非常感激。
答案 0 :(得分:1)
我们可以通过将'resultID'列转换为factor
并指定levels
来轻松完成此操作,然后获取table
resultDF$resultID <- factor(resultID, levels = LETTERS[1:8])
cbind(resultRunn = unique(resultDF$resultRun), as.data.frame.matrix(+(table(resultDF)!=0)))
# resultRunn A B C D E F G H
#1 1 1 0 0 1 0 0 0 0
#2 2 0 0 1 0 0 0 1 0
#3 3 1 0 0 0 0 0 0 1