[英]Count or sum specific string (strings) in each row (rowwise) using dplyr
我会建议下一个方法。 您可以计算变量然后合并。 您可以使用dplyr
完成所有这些操作。 您还需要使用pivot_longer()
和pivot_wider()
格式化数据。 这些功能属于tidyr
。 调用tidyverse
时会加载以前的包。 您可以创建摘要变量,然后加入创建一个公共 id 变量。 这里的代码:
library(tidyverse)
#Code
ds %>% mutate(id=1:n()) %>%
left_join(ds %>% mutate(id=1:n()) %>% pivot_longer(cols = -id) %>%
group_by(id,value) %>% summarise(N=n()) %>%
pivot_wider(names_from = value,values_from=N)) %>%
select(-id) %>% replace(is.na(.), 0)
输出:
X1 X2 X3 X4 TP FP TN FN
1 TP TP TN FP 2 1 1 0
2 TP TP TN TN 2 0 2 0
3 FN FN FP FP 0 2 0 2
4 FN FN FP FP 0 2 0 2
我们可以使用mtabulate
轻松做到这mtabulate
library(qdapTools)
cbind(ds, mtabulate(as.data.frame(t(ds))))
# X1 X2 X3 X4 FN FP TN TP
#V1 TP TP TN FP 0 1 1 2
#V2 TP TP TN TN 0 0 2 2
#V3 FN FN FP FP 2 2 0 0
#V4 FN FN FP FP 2 2 0 0
或使用base R
cbind(ds, as.data.frame.matrix(table(c(row(ds)), unlist(ds))))
或者将tidyverse
与pmap
和unnest_wider
library(dplyr)
library(tidyr)
library(purrr)
ds %>%
mutate(new = pmap(., ~ table(factor(c(...), levels = c("FN", "FP", "TN", "TP"))))) %>%
unnest_wider(c(new))
# A tibble: 4 x 8
# X1 X2 X3 X4 FN FP TN TP
# <chr> <chr> <chr> <chr> <int> <int> <int> <int>
#1 TP TP TN FP 0 1 1 2
#2 TP TP TN TN 0 0 2 2
#3 FN FN FP FP 2 2 0 0
#4 FN FN FP FP 2 2 0 0
使用dplyr
和purrr
一种选择可能是:
ds %>%
bind_cols(map_dfc(.x = unique(unlist(ds)),
~ ds %>%
transmute(!!.x := rowSums(select(., everything()) == .x))))
X1 X2 X3 X4 TP FN TN FP
1 TP TP TN FP 2 0 1 1
2 TP TP TN TN 2 0 2 0
3 FN FN FP FP 0 2 0 2
4 FN FN FP FP 0 2 0 2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.