计算数据帧中行中非零值的计数

时间:2021-04-19 10:07:29

标签: r

我正在尝试计算 dat 框架中行中非零元素的计数,但不起作用。

条件:在计算行中非零元素的计数时只想排除一列

我只想选择 T_1_1,T_1_2,T_1_3.....并排除 T_1_0 并创建一个新列并检查行中有多少非零元素可用。我在这里做什么..??

df <- data.frame("T_1_1"= c(68,24,0,105,58,0,135,126,24),
                 "T_1_2"=c(26,105,0,73,39,97,46,108,0),
                 "T_1_3"=c(93,32,73,103,149,0,147,113,139),
                 "S_2_1"=c(69,67,94,0,77,136,137,92,73),
                 "S_2_2"=c(87,67,47,120,85,122,0,96,79),
                 "S_2_3"= c(150,0,132,121,29,78,109,40,0),
                 "T_1_0"= c(79,0,0,115,98,12,15,121,2)
                 
                 
)


df <- df %>% select(matches("^T_1_1"),-"T_1_0") %>% mutate(new1 = rowSums(matches("^T_1_1")!=0))

2 个答案:

答案 0 :(得分:1)

您可以使用正则表达式 'T_1_[1-9]' 来排除 T_1_0

library(dplyr)
df <- df %>% mutate(new1 = rowSums(select(., matches('T_1_[1-9]')) !=0))
df
#  T_1_1 T_1_2 T_1_3 S_2_1 S_2_2 S_2_3 T_1_0 new1
#1    68    26    93    69    87   150    79    3
#2    24   105    32    67    67     0     0    3
#3     0     0    73    94    47   132     0    1
#4   105    73   103     0   120   121   115    3
#5    58    39   149    77    85    29    98    3
#6     0    97     0   136   122    78    12    1
#7   135    46   147   137     0   109    15    3
#8   126   108   113    92    96    40   121    3
#9    24     0   139    73    79     0     2    2

或更具体:

df <- df %>% mutate(new1 = rowSums(select(., starts_with('T_1'), -T_1_0) !=0))

答案 1 :(得分:1)

这也可以解决您的问题:

library(purrr)

df %>%
  mutate(exclu_T_1_0 = pmap(df %>% select(starts_with("T_1") & !ends_with("0")), 
                            ~ sum(c(...) != 0)))

  T_1_1 T_1_2 T_1_3 S_2_1 S_2_2 S_2_3 T_1_0 exclu_T_1_0
1    68    26    93    69    87   150    79           3
2    24   105    32    67    67     0     0           3
3     0     0    73    94    47   132     0           1
4   105    73   103     0   120   121   115           3
5    58    39   149    77    85    29    98           3
6     0    97     0   136   122    78    12           1
7   135    46   147   137     0   109    15           3
8   126   108   113    92    96    40   121           3
9    24     0   139    73    79     0     2           2