繁体   English   中英

使用 dplyr 对每行(按行)中的特定字符串(字符串)进行计数或求和

[英]Count or sum specific string (strings) in each row (rowwise) using dplyr

假设我有这个数据集

ds <- data.frame(X1 = c("TP","TP","FN","FN"),
             X2 = c("TP","TP","FN","FN"),
             X3 = c("TN","TN","FP","FP"),
             X4 = c("FP","TN","FP","FP"))
                 

我想计算每行中有多少个“TP”“FN”(等)并达到这个结果:
桌子

我曾尝试使用mutate(total_TP= sum(str_detect(select(X1:X4), "TP")))但它不起作用。

我想留在 tidyverse 环境中。

谢谢

我会建议下一个方法。 您可以计算变量然后合并。 您可以使用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))))

或者将tidyversepmapunnest_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

使用dplyrpurrr一种选择可能是:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM