计算每行条件的实例数R.

时间:2015-09-16 20:58:36

标签: r rows frequency

我有一个大文件,第一列是ID,剩下的1304列是基因型,如下所示。

rsID    sample1    sample2    sample3...sample1304
abcd    aa         bb         nc        nc
efgh    nc         nc         nc        nc 
ijkl    aa         ab         aa        nc 

我想算一下" nc"每行的值,并将结果输出到另一列,以便我得到以下内容:

rsID    sample1    sample2    sample3...sample1304    no_calls
abcd    aa         bb         nc        nc            2
efgh    nc         nc         nc        nc            4
ijkl    aa         ab         aa        nc            1

表函数计算每列的频率,而不是行,如果我转换数据以在表函数中使用,我需要文件看起来像这样:

abcd         aa[sample1]
abcd         bb[sample2]
abcd         nc[sample3] ...
abcd         nc[sample1304]
efgh         nc[sample1]
efgh         nc[sample2]
efgh         nc[sample3] ...
efgh         nc[sample1304]

使用这种格式,我会得到以下内容:

ID    nc   aa   ab   bb
abcd  2    1    0    1
efgh  4    0    0    0

有没有人知道按行获取频率的简单方法?我现在正在尝试这个,但它需要相当长的时间才能运行:

rsids$Number_of_no_calls <- apply(rsids, 1, function(x) sum(x=="NC"))

1 个答案:

答案 0 :(得分:7)

您可以使用rowSums

df$no_calls <- rowSums(df == "nc")
df
#  rsID sample1 sample2 sample3 sample1304 no_calls
#1 abcd      aa      bb      nc         nc        2
#2 efgh      nc      nc      nc         nc        4
#3 ijkl      aa      ab      aa         nc        1

或者,正如MrFlick指出的那样,要从行总和中排除第一列,您可以稍微修改一下

的方法。
df$no_calls <- rowSums(df[-1] == "nc")

关于行名称:它们不计入rowSums,你可以做一个简单的测试来证明它:

rownames(df)[1] <- "nc"  # name first row "nc"
rowSums(df == "nc")      # compute the row sums
#nc  2  3             
# 2  4  1        # still the same in first row