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))