This question already has answers here:
How to count the frequency of a string for each row in R

(2 个回答)


5年前关闭。




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

table 函数计算每列的频率,而不是行,如果我转置要在 table 函数中使用的数据,我需要文件如下所示:
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"))

最佳答案

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

关于r - 计算每行 R 条件的实例数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32618583/

10-12 17:12