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
在这个例子中意味着:
- 项目 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'),然后使用 rowsum
按 'ID' 分组得到每列的sum
,再次转换为逻辑(!=0
),使用apply
和MARGIN=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))
我有以下 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
在这个例子中意味着:
- 项目 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'),然后使用 rowsum
按 'ID' 分组得到每列的sum
,再次转换为逻辑(!=0
),使用apply
和MARGIN=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))