R中的数组计算

Array calculation in R

我有以下 table:

        ID  Measure1  Measure2     XO      X1      x2      x3       x4     x5   Flag
Customer 1        30         2  item1   item1   item5   item2   item12  item4     1
Customer 1        30         2  item2   item1   item5   item2   NA       NA       3
Customer 1        30         2  item4   item2   item5   item2   item12  item4     5

其中 flag 指示 XO(atual) 等于 x1-x5(predicted) 之一且 returns 其位置的情况。

接下来我要执行的步骤是执行一种正确匹配的累积分布,这将由 5 个新列 (flag1-flag5) 表示,最终产品将是这样的:

        ID  Measure1  Measure2  Flag1  Flag2  Flag3  Flag4  Flag5
Customer 1        30         2      1      1      2      2      3

在这个例子中意味着:

有什么想法吗?

我们创建数据集的一个子集,即列 X1 到 x ('df3')。在 'XO' 和 'df3' 之间的长度相同后,比较以创建逻辑矩阵 ('i1'),然后使用 rowsum 按 'ID' 分组得到每列的sum,再次转换为逻辑(!=0),使用applyMARGIN=1得到每行的cumsum,转置(t) 和 cbind 以及 'df2' 前 3 列的 unique 个元素。

df3 <- df2[5:(ncol(df2)-1)]
i1 <- df2$XO[row(df3)]==df3
cbind(unique(df2[1:3]),
      t(apply(rowsum(+(i1), group=df2$ID)!=0, 1, cumsum)))
#          ID Measure1 Measure2 X1 x2 x3 x4 x
#1 Customer 1       30        2  1  1  2  2 3
#4 Customer 2       32        4  0  1  2  2 2

数据

df2 <- structure(list(ID = c("Customer 1", "Customer 1", "Customer 1", 
"Customer 2", "Customer 2", "Customer 2"), Measure1 = c(30L, 
30L, 30L, 32L, 32L, 32L), Measure2 = c(2L, 2L, 2L, 4L, 4L, 4L
), XO = c("item1", "item2", "item4", "item1", "item5", "item7"
), X1 = c("item1", "item1", "item1", "item5", "item1", "item1"
), x2 = c("item5", "item5", "item5", "item1", "item5", "item5"
), x3 = c("item2", "item2", "item2", "item2", "item2", "item7"
), x4 = c("item12", "item12", "item12", "item12", "item12", "item12"
), x = c("item4", "item4", "item4", "item4", "item4", "item4"
), Flag = c(1L, 3L, 5L, 2L, 2L, 3L)), .Names = c("ID", "Measure1", 
"Measure2", "XO", "X1", "x2", "x3", "x4", "x", "Flag"), class = "data.frame",
        row.names = c(NA, 
-6L))