如何根据自己的列SD从文件中删除行?

如何根据自己的列SD从文件中删除行?

我遇到了一个问题,我需要根据文件自己的 SD 从文件中删除行。我尝试过 awk 但还没有弄清楚。

这是输入文件:

A x 50
B y 100
C q 34
D ua 80

我想首先计算第三列的平均值和标准差,这可以通过像这样的命令来完成

awk '{s+=$3; ss+=$3^2} END{print mean=s/NR, SD=sqrt(ss/NR-m^2)}' file

但是,我想根据 SD 进一步删除行 - 例如,我只想要高于平均值 0.5 SD 的行,它会是这样的

awk '$3 > m + 0.5*n' file > fileout

有没有办法将这两个 awk 链接成一个?如果没有的话还有其他方法吗?

非常感谢!

答案1

$ awk 'NR==FNR{ s+=$3; ss+=$3^2; nr=NR; next }
       FNR==1 { mean=s/nr; sd=sqrt(ss/nr-mean^2) }
       $3> mean+(0.5*sd)' infile infile
B y 100
D ua 80

答案2

我建议你在 python 中使用它:

import pandas as pd
import numpy as np

# Read the input file into a pandas DataFrame
input = pd.read_csv('file', delimiter=' ', header=None)

# Calculate the mean and standard deviation
mean = input[2].mean()
sd = input[2].std()

# Filter rows based on the condition
filtered = df[df[2] > mean + 0.5 * sd]

# Write the filtered DataFrame to an output file
filtered.to_csv('outfile', sep=' ', header=False, index=False)

该代码将文件读入 pandas DataFrame,计算平均值和标准差,根据条件过滤行,最后将过滤后的 DataFrame 写入输出文件。

如果您不熟悉Python,可以复制以下命令并将其粘贴到在线 Python 代码编辑器

## Prepare your input file
lines = ['A x 50', 'B y 100', 'C q 34', 'D ua 80']

with open('file', 'w') as file:
    for line in lines:
        file.write(line + '\n')
        
## The command to remove rows from input based on its SD       
import pandas as pd
import numpy as np

# Read the input 
input = pd.read_csv('file', delimiter=' ', header=None)

# Calculate the mean and standard deviation
mean = input[2].mean()
sd = input[2].std()

# Filter rows based on your condition
fileout = input[input[2] > mean + 0.5 * sd]

# Print the output
print(fileout)

请注意,此命令将准备输入数据。

相关内容