You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 17:22:15