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

R语言:对DataFrame逐行应用Function,计算my.vec在该行列中的占比

嘿,这需求不难搞定!我来给你两种实用的实现方式,都是通过对每行应用函数来完成的~

首先先明确咱们的目标:对df里的每一行,统计x1到x5这5个值中,有多少个属于my.vec,再除以5得到占比,最后把这个占比新增为数据框的一列(比如叫my_vec_ratio)。

方法1:用基础R的apply()函数

基础R自带的apply()可以轻松对数据框的行/列批量应用自定义函数,代码也很简洁:

# 先把你提供的原始数据定义放出来,方便直接运行
my.vec <- c(244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258)
set.seed(123)
df <- data.frame(loc.id = rep(1:10), 
                 x1 = sample(190:285,10, replace = T), 
                 x2 = sample(200:350,10, replace = T), 
                 x3= sample(100:280,10, replace = T), 
                 x4= sample(250:350,10, replace = T), 
                 x5 = sample(150:300,10, replace = T))

# 定义处理每行的自定义函数
calc_myvec_ratio <- function(row) {
  # 提取当前行的x1到x5列(因为第一列是loc.id,所以取索引2到6)
  row_values <- row[2:6]
  # 统计属于my.vec的元素个数
  match_count <- sum(row_values %in% my.vec)
  # 计算占比(总共有5个变量,所以除以5)
  match_count / length(row_values)
}

# 对每行应用函数,新增列到df
df$my_vec_ratio <- apply(df, MARGIN = 1, FUN = calc_myvec_ratio)

方法2:用tidyverse的rowwise()语法

如果你平时习惯用dplyr这类tidyverse工具,这种写法可读性更强,也更符合现代R的代码风格:

library(dplyr)  # 先加载dplyr包

df <- df %>%
  rowwise() %>%  # 开启行分组模式,让后续操作逐行执行
  mutate(
    # c_across(x1:x5) 提取当前行的x1到x5所有值,然后统计属于my.vec的数量,再除以5
    my_vec_ratio = sum(c_across(x1:x5) %in% my.vec) / 5
  ) %>%
  ungroup()  # 记得取消行分组,避免后续操作受到行分组的影响

验证结果

运行完上面任意一种方法后,你可以用print(df)查看结果,就能看到新增的my_vec_ratio列啦。比如某一行的x1-x5里有3个值在my.vec里,那对应的占比就是0.6,完全符合需求。

内容的提问来源于stack exchange,提问作者89_Simple

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:56:28