当所有列都小于一时如何删除一行

当所有列都小于一时如何删除一行

我有一个矩阵文件

a  0.34  3.03  1.92
b  1.35  1.34  0.63
c  0.66  2.32  1.01
d  0.23  2.07  0.22
e  0.34  0.47  0.55

我必须删除列中所有值都小于 1 的行。

预期输出文件为

a  0.34  3.03  1.92
b  1.35  1.34  0.63
c  0.66  2.32  1.01
d  0.23  2.07  0.22

我得到这个链接,当所有列都小于零时,它们会删除行https://stackoverflow.com/questions/20592611/how-to-delete-rows-where-all-the-columns-are-zero,他们在 R 中使用行总和。但我不认为在这种情况下行总和会起作用。

答案1

要排除所有(数字)列值小于 1 的行,请打印至少有一列的值大于或等于 1 的行:

$ awk '{for(i=2;i<=NF;i++) if($i >= 1){print; next}}' file
a  0.34  3.03  1.92
b  1.35  1.34  0.63
c  0.66  2.32  1.01
d  0.23  2.07  0.22

或者

perl -alne 'shift @F; print if grep { $_ >= 1 } @F' file

或者(更明确地说,使用anyList::Util 模块)

perl -MList::Util=any -alne 'shift @F; print if any { $_ >= 1 } @F' file

您建议的 R 命令(发表在评论中) 很接近:我认为它失败了,因为您没有排除第一列(非数字)例如。

> dat = read.table("file")
>
> dat
  V1   V2   V3   V4
1  a 0.34 3.03 1.92
2  b 1.35 1.34 0.63
3  c 0.66 2.32 1.01
4  d 0.23 2.07 0.22
5  e 0.34 0.47 0.55
>
> dat[!apply(dat, 1, function(x) all(x < 1)), ]
  V1   V2   V3   V4
1  a 0.34 3.03 1.92
2  b 1.35 1.34 0.63
3  c 0.66 2.32 1.01
4  d 0.23 2.07 0.22
5  e 0.34 0.47 0.55
>

> dat[!apply(dat[,-1], 1, function(x) all(x < 1)), ]
  V1   V2   V3   V4
1  a 0.34 3.03 1.92
2  b 1.35 1.34 0.63
3  c 0.66 2.32 1.01
4  d 0.23 2.07 0.22
>

相关内容