在R中提取字符串数字并统计指定数值的出现次数
在R数据框中统计指定数值的出现次数并添加新变量
问题说明
现有如下R数据框,其中st是用|分隔数字的字符串变量,需要统计每行中v1、v2、v3对应数值在st中的出现次数,最终新增count_v1、count_v2、count_v3三个变量记录统计结果:
st <- c("7.4|7.4|8|8|8|8|7.4|7.4|7.4|","0|-32|0|0|-32|-3|-3|-3|-3|-3|-3|-3|") v1 <- c(8,-32) v2 <- c(0,0) v3 <- c(7.4,-3) dat <- as.data.frame(cbind(v1,v2,v3,st))
预期统计结果为:
count_v1 = c(4,2) count_v2 = c(0,3) count_v3 = c(5,7)
解决方案
方法1:使用dplyr + stringr(推荐)
先安装并加载依赖包,再通过逐行处理实现统计:
# 安装依赖包(首次运行需要) install.packages(c("dplyr", "stringr")) library(dplyr) library(stringr) # 处理数据并添加计数变量 dat <- dat %>% mutate( # 拆分字符串并过滤末尾空值(因原字符串结尾有|) st_clean = lapply(str_split(st, "\\|"), function(x) x[x != ""]), # 统计对应数值出现次数 count_v1 = mapply(function(vec, val) sum(vec == as.character(val)), st_clean, v1), count_v2 = mapply(function(vec, val) sum(vec == as.character(val)), st_clean, v2), count_v3 = mapply(function(vec, val) sum(vec == as.character(val)), st_clean, v3) ) %>% # 移除中间临时变量(可选) select(-st_clean)
方法2:基础R循环实现
如果不想使用第三方包,可通过基础循环完成:
# 初始化计数变量 dat$count_v1 <- numeric(nrow(dat)) dat$count_v2 <- numeric(nrow(dat)) dat$count_v3 <- numeric(nrow(dat)) # 逐行统计 for(i in 1:nrow(dat)){ # 拆分字符串并过滤空值 vec <- strsplit(dat$st[i], "\\|")[[1]] vec <- vec[vec != ""] # 统计次数(注意转字符串类型匹配) dat$count_v1[i] <- sum(vec == as.character(dat$v1[i])) dat$count_v2[i] <- sum(vec == as.character(dat$v2[i])) dat$count_v3[i] <- sum(vec == as.character(dat$v3[i])) }
结果验证
运行代码后查看数据框,会发现新增的三个计数变量已符合预期统计结果:
print(dat)
内容的提问来源于stack exchange,提问作者Max Montana
相关产品推荐
相关产品推荐

