我有一个非常具体的数据集,但是很不方便,像这样:
data <- textConnection("rs1050,15,234323,C,T
1,7329,0.1147,-0.0024,0.0048
1,9810,0.6399,0.001174,0.006095
1,16550,0.648541108,0.0061,0.0070
rs7895,NA,NA,A,C
1,997,NA,NA,0.0732
1,9810,0.0339,-0.016131,0.021611
1,16550,0.32739678,0.0014,0.0053
rs995,18,100336,C,T
1,7385,0.2692,-0.0063,0.0035
1,9810,0.5397,-0.002697,0.006012
1,16550,0.651147483,-0.0045,0.0053")
test_data <- read.csv(data, header = FALSE, sep = ",")
如果包含rs####
的行包含NA
(在一列或多列中),则需要将其删除。这本身就没有问题,但在这种情况下,还需要删除该行下面的三行(无论这些行中是否存在所有数据)。
因此,在上述数据的情况下,将删除第5-8行。
任何解决方案都会很棒,但到目前为止我的努力都是基于sed。像这样的东西?
sed -i '/rs*\t*\tNA\tNA\t*/~1-3d' test_data
sed -i '/rs*\t*\tNA\tNA\t*/,+3d' test_data
我觉得我很亲近,任何想法都会受到赞赏!
答案 0 :(得分:1)
这应该没问题,除非您的实际数据有培训")
...
sed '/^rs.*NA/,+3d' test_data
答案 1 :(得分:0)
sed '/^rs[0-9]+\tNA\tNA\t/,+3d' <input_data >output_data
答案 2 :(得分:0)
使用awk
:
awk '/^rs.*NA/ { output = 0; } /^rs/ && !/NA/ { output = 1; } output { print }'
可能会更好一点优化,但对于读者来说,这是一个众所周知的练习......
这有三个部分 - 如果一行以rs
开头且包含NA
,则会关闭output
变量。如果一行以rs
开头且不包含NA
,则会重新开启output
。然后,如果output
当前处于启用状态,则会打印该行,无论其是否包含rs
或NA
。