计算大于 0 的值并计算一行中有多少匹配模式(在 R 中)

Count values above 0 and count how many match a pattern in a row (in R)

我想计算每列中有多少行 >0 以及其中有多少行(>0)以“mt-”开头。 结果也应该在数据框中。 这是一个例子。

df1

mt-abc 1  0  2
mt-dca 1  1  2
cla    0  2  0
dla    0  3  0

结果

above0 2  3  2
mt     2  1  2

在基础 R 中你可以这样做:

mat <- df[-1] > 0

rbind(above0 = colSums(mat), 
      mt = colSums(startsWith(df$V1, 'mt') & mat))

#       V2 V3 V4
#above0  2  3  2
#mt      2  1  2

实际数据在列中有数字,在行名中有名称,我们可以这样做:

mat <- df > 0

rbind(above0 = colSums(mat), 
      mt = colSums(startsWith(rownames(df), 'mt') & mat))

数据

df <- structure(list(V1 = c("mt-abc", "mt-dca", "cla", "dla"), V2 = c(1L, 
1L, 0L, 0L), V3 = 0:3, V4 = c(2L, 2L, 0L, 0L)), class = "data.frame", 
row.names = c(NA, -4L))

我不认为这是 tidyverse 中最优雅的方法,但出于好奇:

library(tidyverse)
my_df <- data.frame(
  stringsAsFactors = FALSE,
               var = c("mt-abc", "mt-dca", "cla", "dla"),
                 x = c(1L, 1L, 0L, 0L),
                 y = c(0L, 1L, 2L, 3L),
                 z = c(2L, 2L, 0L, 0L)
)

df_1 <- my_df %>% 
  summarize(across(.cols=x:z, .fn=~sum(.x > 0))) %>% 
  mutate(var="above0")

df_2 <- my_df %>% 
  filter(str_detect(var, "^mt")) %>% 
  summarise(across(.cols=x:z, .fn=~sum(.x > 0))) %>% 
  mutate(var="mt")
bind_rows(df_1, df_2)
#>   x y z    var
#> 1 2 3 2 above0
#> 2 2 1 2     mt

reprex package (v0.3.0)

于 2020-12-04 创建