如何在R中编写函数提取并复制数据框(df)指定列的数值
R语言数据框列处理方案
提取整列数值的基础方法
如果你仅需要获取该列所有数值组成的向量,直接使用数据框列索引即可,假设该列列名为num,代码为:
col_values <- df$num
向量化素数判断实现
你参考的is.prime函数仅支持单个数值输入,原因是函数中使用的||是仅支持标量的短路逻辑运算符,且all()会对输入的整个向量做全局判断,无法逐元素计算。你可以通过两种方式实现整列批量处理:
方案1:快速包装单值函数
用Vectorize()直接对原单值函数做向量化适配,代码改动最小:
# 原单值素数判断函数 is.prime_single <- function(n) n == 2L || all(n %% 2L:ceiling(sqrt(n)) != 0) # 转为支持向量输入的函数 is.prime <- Vectorize(is.prime_single) # 对整列做素数判断,结果存入新列is_prime df$is_prime <- is.prime(df$num)
方案2:原生向量化实现(效率更高)
针对长列场景,直接改写为向量化逻辑运行速度更快:
is.prime_vec <- function(n_vec) { res <- logical(length(n_vec)) # 小于2的数不是素数 res[n_vec < 2] <- FALSE # 2是素数 res[n_vec == 2L] <- TRUE # 大于2的偶数不是素数 even_flag <- n_vec > 2L & n_vec %% 2L == 0 res[even_flag] <- FALSE # 处理剩余的奇数 remain_n <- n_vec[!even_flag & n_vec > 2L] if (length(remain_n) > 0) { max_div <- ceiling(sqrt(max(remain_n))) divisors <- seq(3L, max_div, by = 2L) res[!even_flag & n_vec > 2L] <- sapply(remain_n, function(x) all(x %% divisors != 0)) } return(res) } # 调用 df$is_prime <- is.prime_vec(df$num)
测试结果
针对你给出的列数值,运行后得到的素数判断结果为:TRUE、TRUE、FALSE、TRUE、FALSE、FALSE、TRUE、FALSE、TRUE、FALSE、TRUE、FALSE、TRUE
内容的提问来源于stack exchange,提问作者user15697038
相关产品推荐
相关产品推荐

