我有一个关于组合的问题,但是在一个相当复杂的情况下,我还没有找到任何帮助。我正在尝试找到一种方法来报告数据集中列的所有可能组合。
关于土地变化的文献调查的数据报告,并指出每篇文章中报告了哪些近似和潜在的驱动因素。因此,行指示单个文章,并且列都是邻近和底层驱动程序。有六种类型的邻近驱动程序和五种类型的底层驱动程序。对于每篇文章,1都放在该文章中标识的驱动程序列中,而驱动程序列中的0则放在该文章中。该表看起来大致如此:
key | d1 | d2 |...| d6 | i1 |...| i5 |
--------------------------------------
A1 | 1 | 0 |...| 1 | 1 |...| 0 |
A2 | 0 | 1 |...| 0 | 0 |...| 1 |
当文章A1将d1和d6标识为直接驱动程序而i1标识为间接驱动程序等时
我想要做的是找出报告直接驱动程序,间接驱动程序以及直接和间接驱动程序的所有可能组合的文章数量。那么,例如,有多少文章识别d1,d2和i1;有多少识别d1,d2和i2;等等?我的学生将表格放在Excel文件中,我想也许Calc或Base可能具有自动化过程的功能。有没有人知道如何做到这一点?
谢谢!
答案 0 :(得分:0)
我终于放弃了,采取了蛮力的方法。我将表导出到文本并将其拉入MySQL,然后使用bash脚本迭代选项。如果其他人有类似的问题,这里是bash脚本:
# Generate array containing factors
faclis1=( d_inf d_com d_inm d_ind d_agr d_bos i_dem i_eco i_tec i_pol i_cul );
#faclis=( "d_inf" "d_com" "d_inm" );
a=0
#echo ${faclis[@]};
# Remove output file if exists
if [ -e permcounts.txt ];
then
rm permcounts.txt;
fi;
# Cycle through list of factors
for f1 in ${faclis1[@]};
do
# only proceed if factor not null
if [ ${f1} ];
then
# print remaining array just to be sure
echo "factor list is ${faclis1[@]}";
#echo ${faclis[@]};
echo "Now on factor ${f1}";
echo "FACTOR ${f1}" >> permcounts.txt;
mysql -u harvey -pdavid -e "select count(clave) from genfact where \
${f1} = 1;" metamorelia >> permcounts.txt;
# create sub array without current factor, 2 factors
faclis2=( ${faclis1[@]/${f1}/} );
#set sub-counter
b=0
#echo "${faclis2[@]}";
# loop through sub array, two factors
for f2 in ${faclis2[@]};
do
if [ ${f2} ] && \
[ "${f1}" != "${f2}" ];
then
echo "FACTOR ${f1} \
AND ${f2}" >> permcounts.txt;
mysql -u harvey -pdavid -e "select count(clave) from genfact where \
${f1} = 1 and \
${f2} = 1;" metamorelia >> permcounts.txt;
# next sub-array
faclis3=( ${faclis2[@]//${f2}} );
c=0
#echo "${faclis3[@]}";
# loop through sub-array
for f3 in ${faclis3[@]};
do
if [ ${f3} ] && \
[ "${f1}" != "${f3}" ] && \
[ "${f2}" != "${f3}" ];
then
echo "FACTOR ${f1} \
AND ${f2} \
AND ${f3}" >> permcounts.txt;
mysql -u harvey -pdavid -e "select count(clave) from genfact where \
${f1} = 1 and \
${f2} = 1 and \
${f3} = 1;" metamorelia >> permcounts.txt;
# next sub-array
faclis4=( ${faclis3[@]//${f3}} );
d=0
#echo "${faclis4[@]}";
# loop through sub-array
for f4 in ${faclis4[@]};
do
if [ ${f4} ] && \
[ "${f1}" != "${f4}" ] && \
[ "${f2}" != "${f4}" ] && \
[ "${f3}" != "${f4}" ];
then
echo "FACTOR ${f1} \
AND ${f2} \
AND ${f3} \
AND ${f4}" >> permcounts.txt;
mysql -u harvey -pdavid -e "select count(clave) from genfact where \
${f1} = 1 and \
${f2} = 1 and \
${f3} = 1 and \
${f4} = 1;" metamorelia >> permcounts.txt;
# next sub-array
faclis5=( ${faclis4[@]//${f4}} );
e=0
#echo "${faclis5[@]}";
# loop through sub-array
for f5 in ${faclis5[@]};
do
if [ ${f5} ] && \
[ "${f1}" != "${f5}" ] && \
[ "${f2}" != "${f5}" ] && \
[ "${f3}" != "${f5}" ] && \
[ "${f4}" != "${f5}" ];
then
echo "FACTOR ${f1} \
AND ${f2} \
AND ${f3} \
AND ${f4} \
AND ${f5}" >> permcounts.txt;
mysql -u harvey -pdavid -e "select count(clave) from genfact where \
${f1} = 1 and \
${f2} = 1 and \
${f3} = 1 and \
${f4} = 1 and \
${f5} = 1;" metamorelia >> permcounts.txt;
# next sub-array
faclis6=( ${faclis5[@]//${f5}} );
f=0
#echo "${faclis6[@]}";
# loop through sub-array
for f6 in ${faclis6[@]};
do
if [ ${f6} ] && \
[ "${f1}" != "${f6}" ] && \
[ "${f2}" != "${f6}" ] && \
[ "${f3}" != "${f6}" ] && \
[ "${f4}" != "${f6}" ] && \
[ "${f5}" != "${f6}" ];
then
echo "FACTOR ${f1} \
AND ${f2} \
AND ${f3} \
AND ${f4} \
AND ${f5} \
AND ${f6}" >> permcounts.txt;
mysql -u harvey -pdavid -e "select count(clave) from genfact where \
${f1} = 1 and \
${f2} = 1 and \
${f3} = 1 and \
${f4} = 1 and \
${f5} = 1 and \
${f6} = 1;" metamorelia >> permcounts.txt;
# next sub-array
faclis7=( ${faclis6[@]//${f6}} );
g=0
#echo "${faclis7[@]}";
# loop through sub-array
for f7 in ${faclis7[@]};
do
if [ ${f7} ] && \
[ "${f1}" != "${f7}" ] && \
[ "${f2}" != "${f7}" ] && \
[ "${f3}" != "${f7}" ] && \
[ "${f4}" != "${f7}" ] && \
[ "${f5}" != "${f7}" ] && \
[ "${f6}" != "${f7}" ];
then
echo "FACTOR ${f1} \
AND ${f2} \
AND ${f3} \
AND ${f4} \
AND ${f5} \
AND ${f6} \
AND ${f7}" >> permcounts.txt;
mysql -u harvey -pdavid -e "select count(clave) from genfact where \
${f1} = 1 and \
${f2} = 1 and \
${f3} = 1 and \
${f4} = 1 and \
${f5} = 1 and \
${f6} = 1 and \
${f7} = 1;" metamorelia >> permcounts.txt;
# next sub-array
faclis8=( ${faclis7[@]//${f7}} );
h=0
#echo "${faclis8[@]}";
# loop through sub-array
for f8 in ${faclis8[@]};
do
if [ ${f8} ] && \
[ "${f1}" != "${f8}" ] && \
[ "${f2}" != "${f8}" ] && \
[ "${f3}" != "${f8}" ] && \
[ "${f4}" != "${f8}" ] && \
[ "${f5}" != "${f8}" ] && \
[ "${f6}" != "${f8}" ] && \
[ "${f7}" != "${f8}" ];
then
echo "FACTOR ${f1} \
AND ${f2} \
AND ${f3} \
AND ${f4} \
AND ${f5} \
AND ${f6} \
AND ${f7} \
AND ${f8}" >> permcounts.txt;
mysql -u harvey -pdavid -e "select count(clave) from genfact where \
${f1} = 1 and \
${f2} = 1 and \
${f3} = 1 and \
${f4} = 1 and \
${f5} = 1 and \
${f6} = 1 and \
${f7} = 1 and \
${f8} = 1;" metamorelia >> permcounts.txt;
# next sub-array
faclis9=( ${faclis8[@]//${f8}} );
i=0
#echo "${faclis9[@]}";
# loop through sub-array
for f9 in ${faclis9[@]};
do
if [ ${f9} ] && \
[ "${f1}" != "${f9}" ] && \
[ "${f2}" != "${f9}" ] && \
[ "${f3}" != "${f9}" ] && \
[ "${f4}" != "${f9}" ] && \
[ "${f5}" != "${f9}" ] && \
[ "${f6}" != "${f9}" ] && \
[ "${f7}" != "${f9}" ] && \
[ "${f8}" != "${f9}" ];
then
echo "FACTOR ${f1} \
AND ${f2} \
AND ${f3} \
AND ${f4} \
AND ${f5} \
AND ${f6} \
AND ${f7} \
AND ${f8} \
AND ${f9}" >> permcounts.txt;
mysql -u harvey -pdavid -e "select count(clave) from genfact where \
${f1} = 1 and \
${f2} = 1 and \
${f3} = 1 and \
${f4} = 1 and \
${f5} = 1 and \
${f6} = 1 and \
${f7} = 1 and \
${f8} = 1 and \
${f9} = 1;" metamorelia >> permcounts.txt;
# next sub-array
faclis10=( ${faclis9[@]//${f9}} );
j=0
#echo "${faclis10[@]}";
# loop through sub-array
for f10 in ${faclis10[@]};
do
if [ ${f10} ] && \
[ "${f1}" != "${f10}" ] && \
[ "${f2}" != "${f10}" ] && \
[ "${f3}" != "${f10}" ] && \
[ "${f4}" != "${f10}" ] && \
[ "${f5}" != "${f10}" ] && \
[ "${f6}" != "${f10}" ] && \
[ "${f7}" != "${f10}" ] && \
[ "${f8}" != "${f10}" ] && \
[ "${f9}" != "${f10}" ];
then
echo "FACTOR ${f1} \
AND ${f2} \
AND ${f3} \
AND ${f4} \
AND ${f5} \
AND ${f6} \
AND ${f7} \
AND ${f8} \
AND ${f9} \
AND ${f10}" >> permcounts.txt;
mysql -u harvey -pdavid -e "select count(clave) from genfact where \
${f1} = 1 and \
${f2} = 1 and \
${f3} = 1 and \
${f4} = 1 and \
${f5} = 1 and \
${f6} = 1 and \
${f7} = 1 and \
${f8} = 1 and \
${f9} = 1 and \
${f10} = 1;" metamorelia >> permcounts.txt;
# next sub-array
faclis11=( ${faclis10[@]//${f10}} );
k=0
#echo "${faclis11[@]}";
# loop through sub-array
for f11 in ${faclis11[@]};
do
if [ ${f11} ] && \
[ "${f1}" != "${f11}" ] && \
[ "${f2}" != "${f11}" ] && \
[ "${f3}" != "${f11}" ] && \
[ "${f4}" != "${f11}" ] && \
[ "${f5}" != "${f11}" ] && \
[ "${f6}" != "${f11}" ] && \
[ "${f7}" != "${f11}" ] && \
[ "${f8}" != "${f11}" ] && \
[ "${f9}" != "${f11}" ] && \
[ "${f10}" != "${f11}" ];
then
echo "FACTOR ${f1} \
AND ${f2} \
AND ${f3} \
AND ${f4} \
AND ${f5} \
AND ${f6} \
AND ${f7} \
AND ${f8} \
AND ${f9} \
AND ${f10} \
AND ${f11}" >> permcounts.txt;
mysql -u harvey -pdavid -e "select count(clave) from genfact where \
${f1} = 1 and \
${f2} = 1 and \
${f3} = 1 and \
${f4} = 1 and \
${f5} = 1 and \
${f6} = 1 and \
${f7} = 1 and \
${f8} = 1 and \
${f9} = 1 and \
${f10} = 1 and \
${f11} = 1;" metamorelia >> permcounts.txt;
unset faclis11[k];
k=$((${k} + 1));
fi;
done;
unset faclis10[j];
j=$((${j} + 1));
fi;
done;
unset faclis9[i];
i=$((${i} + 1));
fi;
done;
unset faclis8[h];
h=$((${h} + 1));
fi;
done;
unset faclis7[g];
g=$((${g} + 1));
fi;
done;
unset faclis6[f];
f=$((${f} + 1));
fi;
done;
unset faclis5[e];
e=$((${e} + 1));
fi;
done;
unset faclis4[d];
d=$((${d} + 1));
fi;
done;
unset faclis3[c];
c=$((${c} + 1));
fi;
done;
# Remove analyzed factors from vector
unset faclis2[b];
b=$((${b} + 1));
fi;
done;
# remove nth item from array (progressively remove one item)
unset faclis1[a];
# increment n for next round
a=$((${a} + 1));
echo ${n};
fi;
done;
这个脚本效率有点低,因为我认为我包含了很多不必要的操作,但它完成了工作。 (我认为确实如此。我的学生必须浏览输出文件以确保一切都在那里。)