有没有办法通过 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
值与列分开,unlist
到 vector
并使用 [=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
如果是基于行,用apply
和MARGIN = 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)))
我想要一种方法来根据行的存在来计算数据帧上的值
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
值与列分开,unlist
到 vector
并使用 [=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
如果是基于行,用apply
和MARGIN = 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)))