从数据帧中的向量NOT创建虚拟矩阵

问题描述 投票:1回答:1

我正在处理一个问题,我有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。任何帮助将非常感激。

r
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.