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
相关产品推荐
相关产品推荐

