0

bashで因子ベクトル(すべてのレベルが一意であるとは限りません)を数値ベクトルに変換する最も効率的な方法は何ですか? 数値ベクトルの値は、それぞれが因子の一意の水準を表している限り、重要ではありません。

説明すると、これは bash でやりたいことと同等の R になります。

numeric<-seq_long(levels(factor))[factor]

すなわち:

要素

AV1019A
ABG1787
AV1019A
B77hhA
B77hhA

数値

1
2
1
3
3

どうもありがとう。

4

1 に答える 1

2

おそらく最も効率的ではありませんが、おそらく何かを開始することです。

#!/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 を使用している場合は、ファイルが 1 つ少なくなり、明らかにより効率的になります。

#!/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
于 2015-10-05T14:47:35.900 に答える