有没有办法通过 R 中每行的存在来计算值?

Is there a way to count values by presence per rows in R?

我想要一种方法来根据行的存在来计算数据帧上的值

a = data.frame(c('a','b','c','d','f'), 
               c('a','b','a','b','d'))
colnames(a) = c('let', 'let2')

在这个可重现的例子中,我们在第一行和第三行出现了字母“a”,总共出现了两次。如果存在为真,我已经编写了这段代码来计算值,但我希望它自动为数据帧中存在的所有变量归因:

#for counting the variable a and atribunting the count to the b dataframe

b = data.frame(unique(unique(unlist(a))))
b$count = 0

for(i in 1:nrow(a)){
  if(TRUE %in% apply(a[i,], 2, function(x) x %in% 'a') == TRUE){
    b$count[1] = b$count[1] + 1
  }  
}

b$count[1]
[1] 2

问题是我必须为所有变量手动进行此操作,并且我想要一种自动进行此操作的方法。有办法吗?预期输出为:

1                         a     2
2                         b     2
3                         c     1
4                         d     2
5                         f     1

这个有用吗:

library(dplyr)
library(tidyr)
a %>% pivot_longer(cols = everything()) %>% distinct() %>% count(value)
# A tibble: 5 x 2
  value     n
  <chr> <int>
1 a         2
2 b         2
3 c         1
4 d         2
5 f         1

使用的数据:

a
  let let2
1   a    a
2   b    b
3   c    a
4   d    b
5   f    d

可以在 base R 中完成,方法是将 unique 值与列分开,unlistvector 并使用 [=19 获得频率计数=].如果需要,将 table 对象转换为两列 data.frame 和 stack

stack(table(unlist(lapply(a, unique))))[2:1]

-输出

#  ind values
#1   a      2
#2   b      2
#3   c      1
#4   d      2
#5   f      1

如果是基于行,用applyMARGIN = 1

table(unlist(apply(a, 1, unique)))

或按行分组以获得 unique 并用 table

计数
table(unlist(tapply(unlist(a), list(row(a)), unique)))

或者使用 collapse

中的 dapply 的更快方法
library(collapse)
table(unlist(dapply(a, funique, MARGIN = 1)))