【问题标题】:Counting number of instances of a condition per row R [duplicate]计算每行 R 条件的实例数 [重复]
【发布时间】:2015-12-13 15:06:21
【问题描述】:

我有一个大文件,第一列是 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"))

【问题讨论】:

  • R 区分大小写。数据显示“nc”,但应用“NC”...¿?
  • rowSums 可能是正确的函数

标签: r rows frequency


【解决方案1】:

您可以使用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

【讨论】:

  • 也许df$no_calls &lt;- rowSums(df[,-1] == "nc") 忽略第一列中的任何“nc”值。
  • @MrFlick,如果该列中有任何内容,那就太好了
  • @doc 如果将第一列作为行名读入,您发布的原始代码是否会计算第一列中的“nc”值?
  • @nchimato,不会的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-20
  • 1970-01-01
  • 2021-01-28
相关资源
最近更新 更多