首页 > 解决方案 > 数据框中出现的次数

问题描述

我有以下数据框,我想按第一列计算每一行的出现次数,并作为另一列附加到数据框中说“freq”:

东风:

gene    a    b    c
abc     1    NA   1
bca     NA   1    1
cba     1    2    1

我的 df 更大,所以这只是一个可扩展的例子。

期望的数据框是:

gene    a    b    c    freq
abc     1    NA   1     2
bca     NA   1    1     2
cba     1    2    1     3

我尝试过的代码是:

g <- df %>% mutate(numtwos = rowSums(. > 0))

或者

df$freq <- apply(df , 1, function(x) length(which(x>0)))

但它不起作用,因为如果连续应该有(例如)150 次重复,我每行只获得 2 次。

欢迎任何帮助或其他观点!

谢谢

标签: rdataframefrequency

解决方案


我们可以先使用转换Na为“NA”

library(dplyr)
df %>%
   mutate_at(vars(a:c), ~ as.numeric(na_if(., "Na"))) %>%
   mutate(freq = rowSums(select(., a:c), na.rm = TRUE))
#  gene  a  b c freq
#1  abc  1 NA 1    2
#2  bca NA  1 1    2
#3  cba  1  1 1    3

这里的值都是1,所以和得到non-NA的和是一样的

df %>%
   mutate_at(vars(a:c), ~ as.numeric(na_if(., "Na"))) %>%
   mutate(freq = rowSums(!is.na(select(., a:c))))

数据

df <- structure(list(gene = c("abc", "bca", "cba"), a = c("1", "Na", 
"1"), b = c("Na", "1", "1"), c = c(1L, 1L, 1L)), 
class = "data.frame", row.names = c(NA, 
-3L))

推荐阅读