我有一个“小组历史记录”选项卡,用于记录每个学生被分入的小组。“小组历史记录”选项卡内容的屏幕截图:
另一个名为“历史矩阵”的选项卡我已经成功地计算了每个学生与另一个学生在一个小组中的次数,并且我能够拖动手柄来动态更新其他单元格。 历史矩阵选项卡内容截图:
问题是,目前设置为仅适用于那两列日期,我必须更新未来日期的公式,这会变得很麻烦。还有,按照目前的编写方式,如果我删除 N 之前的任何列,那么它就会放弃它,因为某些公式使用 INDIRECT,它通过字符串文本提及这些列名称,而不是实际连接列来动态更新和他们在一起。 这是历史矩阵的单元格 B3 中当前的公式:
=IF(B$2=$A3, "x", SUM((--('Group History'!$N3=INDIRECT("Group History!$N"&COLUMN(B$2)+1))) + (--('Group History'!$O3=INDIRECT("Group History!$O"&COLUMN(B$2)+1)))))
我尝试过 ChatGPT premium,但它只是绕圈子,没有任何帮助。
使用 Microsoft 365,您可以尝试以下操作:
=LET(
students, 'Group History'!A3:A28,
grp_assigned, 'Group History'!B3:AD28,
num_students, ROWS(students),
st_indices, SEQUENCE(num_students),
num_shared, LAMBDA(x, y,
IF(
x = y,
"x",
SUM(
--BYCOL(
CHOOSEROWS(grp_assigned, x, y),
LAMBDA(c, IF(SUM(--(LEN(TRIM(c)) = 0)), 0, ROWS(UNIQUE(c)) = 1))
)
)
)
),
history_matrix, MAKEARRAY(num_students, num_students, num_shared),
HSTACK(VSTACK("", students), VSTACK(TOROW(students), history_matrix))
)
结果:
一次迭代两行(学生),然后按每个(日期)列迭代:
SUM(--(LEN(TRIM(c)) = 0))
ROWS(UNIQUE(c)) = 1
请根据未来可能的条目调整范围
B3:AD28
。
Google 表格
似乎需要进行一些调整:
BYCOL
,与 --(ROWS(UNIQUE(c)) = 1)
sum(--byrow(c, lambda(a, len(trim(a)) = 0)))
=LET(
students, 'Group History'!A3:A28,
grp_assigned, 'Group History'!B3:AD28,
num_students, ROWS(students),
st_indices, SEQUENCE(num_students),
num_shared, LAMBDA(x, y,
IF(
x = y,
"x",
SUM(
BYCOL(
CHOOSEROWS(grp_assigned, x, y),
LAMBDA(c, IF(sum(--byrow(c, lambda(a, len(trim(a)) = 0))), 0, --(ROWS(UNIQUE(c)) = 1)))
)
)
)
),
history_matrix, MAKEARRAY(num_students, num_students, num_shared),
result, HSTACK(VSTACK("", students), VSTACK(TOROW(students), history_matrix)),
result
)
假设您的表格都从单元格
A1
开始,在 'Group History'!B2
中,输入:
=IF($A2<>B$1,SUMPRODUCT((XLOOKUP($A2,'Group History'!$A$3:$A$28,'Group History'!$B$3:$S$28, 0,0)=XLOOKUP(B$1,'Group History'!$A$3:$A$28,'Group History'!$B$3:$S$28,0,0))*(XLOOKUP($A2,'Group History'!$A$3:$A$28,'Group History'!$B$3:$S$28, 0,0)<>"")),"x")
然后将公式复制到右侧。
使用自动向下和向右填充的数组公式来实现这一点的一种方法是,首先将数据逆透视为面向行的格式,然后迭代学生,计算他们在同一组中的次数其他学生分开。
要取消数据透视,请插入>工作表,将新工作表命名为
Unpivot
,然后将此公式放入单元格A1
中:
=let(
unpivot_, lambda(data, numFixedCols, numColsPerGroup, let(k,n(numFixedCols),d,if(k,data,hstack(sequence(rows(data)),data)),f,if(k,k,1),g,numColsPerGroup,s,lambda(r,c,h,w,chooserows(choosecols(d,sequence(1,w,c)),sequence(h,1,r))),h,hstack(s(1,1,1,f),"Date","GroupID"),i,sequence(1,(columns(d)-f)/g,f+1,g),a,reduce(h,sequence(rows(d)-1,1,2),lambda(a,r,let(x,s(r,1,1,f),b,reduce(tocol(æ,2),i,lambda(y,c,let(z,s(r,c,1,g),if(""=+z,y,vstack(y,hstack(x,s(1,c,1,1),z)))))),vstack(a,b)))),if(k,a,choosecols(a,sequence(1,columns(a)-1,2))))),
unpivot_('Group History'!A2:ZZ, 1, 1)
)
这将一直有效到第
ZZ
列,但如果需要,您可以一直到ZZZ
。
要获取矩阵,请插入另一张纸并将此公式放在那里:
=let(
students, tocol('Group History'!A3:A, 1),
data, filter(Unpivot!A2:C, len(Unpivot!A2:A)),
names, choosecols(data, 1),
dates, choosecols(data, 2),
groupIds, choosecols(data, 3),
matrix, map(students, lambda(s, let(
d, filter(dates, names = s),
i, filter(groupIds, names = s),
inSameGroup, filter(names, match(dates & groupIds, d & i, 0)),
counts, query(inSameGroup, "select Col1, count(Col1) group by Col1", 0),
row, arrayformula(ifna(vlookup(
torow(students), counts, 2, false
))),
arrayformula(if(torow(students) = s, "x", row))
))),
vstack(
hstack(
"in the same group on the same date",
torow(students)
),
hstack(students, matrix)
)
)
见 让(), lambda(), 地图(), vstack(), hstack(), 选择cols(), 过滤器(), vlookup(), 匹配(), 数组公式(), 查询(), 托罗() 和 tocol().