如何在R语言数据框中添加列以标记A/B列低于行均值、C/D列高于行均值的列名
解决R语言数据框添加lower和greater列的问题
我来帮你搞定这个需求!你的目标是给数据框新增两列,分别标记每行A/B中低于行均值的列名,以及C/D中高于行均值的列名。我们可以通过逐行处理的方式轻松实现,先看看具体的思路和代码:
核心思路
- 用
apply()函数逐行遍历数据框,对每一行单独做逻辑判断 - 针对每行的A、B列,筛选出数值小于该行
ms的列名,用逗号拼接成字符串(无符合条件的则设为NA) - 针对每行的C、D列,筛选出数值大于该行
ms的列名,同样拼接成字符串(无符合条件则设为NA) - 将处理后的结果合并到原数据框中
完整代码实现
# 先生成原始数据框 set.seed(100) A <- floor(runif(5, min=0, max=10)) B <- floor(runif(5, min=0, max=10)) C <- floor(runif(5, min=0, max=10)) D <- floor(runif(5, min=0, max=10)) df <- data.frame(A,B,C,D) df$ms <- rowMeans(df) # 定义处理单行的函数 process_single_row <- function(row) { # 处理lower列:提取A/B中小于ms的列名 lower_candidates <- row[c("A", "B")] < row["ms"] lower <- if (sum(lower_candidates) == 0) { NA } else { paste(names(which(lower_candidates)), collapse = ",") } # 处理greater列:提取C/D中大于ms的列名 greater_candidates <- row[c("C", "D")] > row["ms"] greater <- if (sum(greater_candidates) == 0) { NA } else { paste(names(which(greater_candidates)), collapse = ",") } return(c(lower = lower, greater = greater)) } # 应用函数到每一行,合并结果到原数据框 result_df <- cbind(df, t(apply(df, 1, process_single_row))) # 查看最终结果 result_df
运行结果
运行后你会得到符合预期的输出:
A B C D ms lower greater 1 3 4 6 6 4.75 A,B C,D 2 2 8 8 2 5.00 A C 3 5 3 2 3 3.25 B NA 4 0 5 3 3 2.75 A C,D 5 4 1 7 6 4.50 A,B C,D
(注:第4行的greater列按逻辑应该是C,D,因为3>2.75,你提供的期望结果可能存在笔误)
关于你之前代码的问题
你之前尝试的lapply(apply(df,1, function(x) which(df$ms)),names)有两个关键问题:
- 在
apply的匿名函数里,df$ms是整个列的所有值,而不是当前行的ms,应该用x["ms"]来获取当前行的均值 which(df$ms)本身的逻辑不对,我们需要的是判断当前行的A/B/C/D值和当前行ms的大小关系,而不是找ms的位置
内容的提问来源于stack exchange,提问作者Adamm
相关产品推荐
相关产品推荐

