计算因子的出现次数,逗号分隔,AND 条件?在 R

Count occurrences of factors, comma separated, AND conditional? in R

我正在尝试进行一些复杂的计算,部分代码要求我解析逗号分隔的条目并计算大于 0 的值的数量。

示例输入数据:

a <- c(0,0,3,0)
b <- c(4,4,0,1)
c <- c("3,4,3", "2,1", 0, "5,8")
x <- data.frame(a, b, c)

x

  a b     c
1 0 4 3,4,3
2 0 4   2,1
3 3 0     0
4 0 1   5,8

我需要解析的列,c 是因子,所有其他列都是数字。逗号分隔的值的数量会有所不同,在此示例中,它从 0 到 3 不等。 所需的输出如下所示:

x$c_occur <- c(3, 2, 0, 2)
x

  a b     c c_occur
1 0 4 3,4,3       3
2 0 4   2,1       2
3 3 0     0       0
4 0 1   5,8       2

其中 c_occur 列出了 c 列中 > 0 的出现次数。

我在想这样的事情会奏效...但我想不通。

library(dplyr
 x_desired <- x %>%
   mutate(c_occur = count(strsplit(c, ","), > 0))

我们可以利用str_count

library(stringr)
library(dplyr)
x %>%
    mutate(c_occur = str_count(c, '[1-9]\d*'))
#  a b     c c_occur
#1 0 4 3,4,3       3
#2 0 4   2,1       2
#3 3 0     0       0
#4 0 1   5,8       2

拆分 'c' 后,我们可以通过 sum 循环遍历 strsplit

list 输出后的逻辑向量来获取计数
library(purrr)    
x %>%
   mutate(c_occur =  map_int(strsplit(as.character(c), ","),
       ~ sum(as.integer(.x) > 0)))
# a b     c c_occur
#1 0 4 3,4,3       3
#2 0 4   2,1       2
#3 3 0     0       0
#4 0 1   5,8       2

或者我们可以用 separate_rows 分隔行并执行 group_by summarise

library(tidyr)    
x %>%
     mutate(rn = row_number()) %>% 
     separate_rows(c, convert = TRUE) %>%
     group_by(rn) %>%
     summarise(c_occur = sum(c >0)) %>%
     select(-rn) %>% 
     bind_cols(x, .)
# A tibble: 4 x 4
#      a     b c     c_occur
#  <dbl> <dbl> <fct>   <int>
#1     0     4 3,4,3       3
#2     0     4 2,1         2
#3     3     0 0           0
#4     0     1 5,8         2