从数据框

时间:2018-03-06 04:06:19

标签: r

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

1 个答案:

答案 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