如何在lapply调用中将数据框列传入with函数?
解决数据框中Measured.开头列的数值判断问题
咱们先拆解下你遇到的问题:要判断数据框里所有以Measured.开头的列,数值是否在1-5之间,或者等于4244。你之前的两种lapply写法都无效,问题出在对with的误用上,咱们一步步来修正。
先明确问题所在
- 第一种写法里的
with完全多余:lapply迭代的是每一列的向量,with需要依托数据框环境才能生效,这里直接用.指代向量是不成立的。 - 第二种写法的
with语法错误:with的正确用法是with(数据对象, 表达式),你把判断表达式直接塞进去,没有指定数据对象,自然会报错。
正确的实现方法
方法1:基础R的lapply写法
先构造一个示例数据集方便测试:
data <- structure(list( ID = 1:10, Measured.Value1 = c(2, 6, 4, 4244, 3, 0, 5, 7, 1, 4244), Measured.Value2 = c(8, 3, 4244, 1, 5, 2, 9, 0, 4, 6), Other.Column = letters[1:10] ), class = "data.frame")
直接对每一列向量做判断,不需要with:
# 生成逻辑判断的列表 judge_list <- lapply(data[, grepl("Measured.", names(data))], function(x) { (x >= 1 & x <= 5) | x == 4244 }) # 如果需要转成数据框格式 judge_df <- as.data.frame(judge_list)
方法2:用dplyr更简洁实现
如果你熟悉tidyverse语法,用dplyr的across可以更直观地处理:
library(dplyr) judge_df <- data %>% # 筛选出Measured.开头的列 select(starts_with("Measured.")) %>% # 对所有列应用判断逻辑 mutate(across(everything(), ~ (.x >= 1 & .x <= 5) | .x == 4244))
测试结果示例
运行上述代码后,judge_df的输出会是:
Measured.Value1 Measured.Value2 1 TRUE FALSE 2 FALSE TRUE 3 TRUE FALSE 4 TRUE TRUE 5 TRUE TRUE 6 FALSE FALSE 7 TRUE TRUE 8 FALSE FALSE 9 TRUE TRUE 10 TRUE FALSE
内容的提问来源于stack exchange,提问作者xeyetopewu
相关产品推荐
相关产品推荐

