在bash中将因子向量(并非所有级别都是唯一的)转换为数字向量的最有效方法是什么?数值向量中的值无关紧要,只要每个值代表因子的唯一级别。
为了说明,这将是 R 等价于我想在 bash 中做的事情:
数字<-seq_along(级别(因子))[因子]
IE:
因素
AV1019A
ABG1787
AV1019A
B77hhA
B77hhA
数字
1
2
1
3
3
非常感谢。
在bash中将因子向量(并非所有级别都是唯一的)转换为数字向量的最有效方法是什么?数值向量中的值无关紧要,只要每个值代表因子的唯一级别。
为了说明,这将是 R 等价于我想在 bash 中做的事情:
数字<-seq_along(级别(因子))[因子]
IE:
因素
AV1019A
ABG1787
AV1019A
B77hhA
B77hhA
数字
1
2
1
3
3
非常感谢。
它很可能不是最有效的,但也许可以开始。
#!/bin/bash
input_data=$( mktemp )
map_file=$( mktemp )
# your example written to a file
echo -e "AV1019A\nABG1787\nAV1019A\nB77hhA\nB77hhA" >> $input_data
# create a map <numeric, factor> and write to file
idx=0
for factor in $( cat $input_data | sort -u )
do
echo $idx $factor
let idx=$idx+1
done > $map_file
# go through your file again and replace values with keys
while read line
do
key=$( cat $map_file | grep -e ".* ${line}$" | awk '{print $1}' )
echo $key
done < $input_data
# cleanup
rm -f $input_data $map_file
我最初想使用关联数组,但它只是一个 bash 4+ 功能,在这里和那里都没有。如果你有 bash 4,那么你就少了一个文件,这显然更有效。
#!/bin/bash
# your example written to a file
input_data=$( mktemp )
echo -e "AV1019A\nABG1787\nAV1019A\nB77hhA\nB77hhA" >> $input_data
# declare an array
declare -a factor_map=($( cat $input_data | sort -u | tr "\n" " " ))
# go through your file replace values with keys
while read line
do
echo ${factor_map[@]/$line//} | cut -d/ -f1 | wc -w | tr -d ' '
done < $input_data
# cleanup
rm -f $input_data