Arrays R中的数组计算

Arrays R中的数组计算,arrays,r,row,Arrays,R,Row,我有下表: 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

我有下表:

        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
其中标志是XO(atual)等于x1-x5(预测)中的一个并返回其位置的情况的指示器

我想执行的下一步是执行一种类型的正确点击的累积分布,由5个新列(flag1-flag5)指示,最终产品如下所示:

        ID  Measure1  Measure2  Flag1  Flag2  Flag3  Flag4  Flag5
Customer 1        30         2      1      1      2      2      3
在本例中,这意味着:

  • 项目1预测为x1,因此flag1=1
  • 在第二列x2中,我没有命中,因此flag2=1(仍有1次命中)
  • 项目2预计为x3,因此flag3=2
  • 在列x4中,我没有命中,因此flag4=2(仍有2次命中)
  • 项目4预计为x5,因此flag5=3

有什么想法吗

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

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

df3您是否为每个项目都提供了唯一的度量值1和度量值2ID@akrun度量值1和度量值2对于同一ID下的每一行都是相同的,因此当聚合到ID级别时,一行将重新命名
df3 nope,它不会创建列flag1-flag5这是我作为输出得到的
x1x2x3x4x12 3
是否可以将NAs视为no命中?否则它将返回NA@ArKo21让我试试看NA@ArKo21你能检查一下
i1[is.na(i1)]i2吗
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))