我想使用功能str_count计算一列中某些字符串的出现次数。对于仅包含正确表达式的行,它可以正常工作。 但是,对于包含一个NA的行,我得到了结果NA,并且我的列中包含很多NA。
我尝试使用tidyverse的summary函数,使用sum函数和%in%运算符以及常规比较来成功完成此任务。到目前为止,Sum和str_count给了我最有希望的结果。
# library(tidyverse)
# Reproducible data frame similar to the one I am working on
# This should resemble long data for two participants, that each have two
# codes in a column
test <- data.frame(name = c("A1", "A1", "B1", "B1"), code_2 = c("SF08", "SF03", "SF03", NA))
# Here is my analysis that counts the number of matches of a code
analysis <- test %>%
group_by(name) %>%
summarize(
total_sf2 = sum(stringr::str_count(code_2, "SF"))
)
我希望参加者A1(我得到)有两场比赛,而参加者B2有一个比赛而不是结果NA
答案 0 :(得分:1)
只需在您的求和电话中添加na.rm = TRUE
:
test %>%
group_by(name) %>%
summarize(
total_sf2 = sum(stringr::str_count(code_2, "SF"), na.rm=TRUE)
)
# A tibble: 2 x 2
# name total_sf2
# <fct> <int>
#1 A1 2
#2 B1 1
答案 1 :(得分:0)
在基数R中,您可以在regexpr
中使用aggregate
,而不受<NA>
的影响。
aggregate(code_2 ~ name, test, function(x) sum(regexpr("SF", x)))
# name code_2
# 1 A1 2
# 2 B1 1
答案 2 :(得分:0)
使用grepl
和data.table
的选项
library(data.table)
setDT(test)[, .(code_2 = sum(grepl("SF", code_2))), name]
# name code_2
#1: A1 2
#2: B1 1