This question already has answers here:
How to count the frequency of a string for each row in R
(2 个回答)
5年前关闭。
我有一个大文件,第一列是 ID,其余 1304 列是如下所示的基因型。
我想计算每行“nc”值的数量,并将结果输出到另一列,以便得到以下结果:
table 函数计算每列的频率,而不是行,如果我转置要在 table 函数中使用的数据,我需要文件如下所示:
使用这种格式,我会得到以下我想要的:
有人知道按行获取频率的简单方法吗?我现在正在尝试这个,但运行需要相当长的时间:
或者,正如 MrFlick 所指出的,要从行总和中排除第一列,您可以稍微修改一下方法
关于行名:它们不计入
(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