2014-12-21 63 views
-3

我有一个大的文本文件,32000行和51列。基于python或R中的列过滤文本文件的行

行是基因,列是样本。每个细胞包含每个样品中每个基因的值。

我想删除那些有10个以上值小于或等于2的基因(行)。例如,0 1 2 3 4 5只有三个小于或等于2的值,所以应该保留。

我用下面的代码来做到这一点,但在运行之后我仍然我有许多行具有多于10个值小于或等于2:

output_file = open("results.txt", 'w') 
for line in open(input_filepath, 'r'): 
    values = line.split(' ') 
    if len([value for value in values[1:] if float(value) <= 2]) <= 10: 
     output_file.write(line) 

这是第一线和其他的人都喜欢它:

ENSG00000000003.10 17.83196398 69.91920499 279.89049 95.61821179 74.80702449 122.5556208 144.8049767 68.68034587 73.67798573 89.95469195 81.85856972 126.9733354 64.93879738 29.4107548 73.03579221 116.0315804 67.90288741 27.57208264 62.52823427 99.03510023 9.39397698 61.45042154 117.1267932 63.15944291 319.4942754 142.3189945 59.98822761 173.5042114 67.29941051 97.12375332 37.94666697 137.0865621 91.06779336 71.44276982 79.58113909 221.2371603 38.62588269 122.5556208 111.12162 260.6636398 184.7700916 100.6786557 97.59881552 264.2982916 161.1062423 92.55084782 64.8034559 117.3666154 89.70704223 51.63439938 
+0

正好。例如在特定行中至少有10列,其值在0和2之间 – ali

+0

因此我想删除这些行 – ali

+1

您显示的代码看起来是正确的,因此很难从此处进行调试。为了帮助您进行调试,我建议将'len'表达式粘贴到变量中,并暂时将其与'line'一起发送到输出文件,以便您可以看到代码**认为** len表达式是 - 然后你可以深入了解为什么**它认为,在这一点上是不清楚的。 –

回答

2

使用R这是简单的:

#some example data 
set.seed(42) 
DF <- data.frame(matrix(rnorm(30), ncol=3)) 
DF <- cbind(id=letters[1:10], DF) 

# id   X1   X2   X3 
# 1 a 1.37095845 1.3048697 -0.3066386 
# 2 b -0.56469817 2.2866454 -1.7813084 
# 3 c 0.36312841 -1.3888607 -0.1719174 
# 4 d 0.63286260 -0.2787888 1.2146747 
# 5 e 0.40426832 -0.1333213 1.8951935 
# 6 f -0.10612452 0.6359504 -0.4304691 
# 7 g 1.51152200 -0.2842529 -0.2572694 
# 8 h -0.09465904 -2.6564554 -1.7631631 
# 9 i 2.01842371 -2.4404669 0.4600974 
# 10 j -0.06271410 1.3201133 -0.6399949 

#remove rows if more than 2 values <= 0 
DF[rowSums(DF[, -1] <= 0) <= 2,] 
# id   X1   X2   X3 
# 1 a 1.3709584 1.3048697 -0.3066386 
# 2 b -0.5646982 2.2866454 -1.7813084 
# 3 c 0.3631284 -1.3888607 -0.1719174 
# 4 d 0.6328626 -0.2787888 1.2146747 
# 5 e 0.4042683 -0.1333213 1.8951935 
# 6 f -0.1061245 0.6359504 -0.4304691 
# 7 g 1.5115220 -0.2842529 -0.2572694 
# 9 i 2.0184237 -2.4404669 0.4600974 
# 10 j -0.0627141 1.3201133 -0.6399949 

它使用CON当它们被传递给rowSums时,逻辑值的版本为0/1。

+0

你是认真的吗?阅读教程。 – Roland