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

如何在R语言数据框中添加列以标记A/B列低于行均值、C/D列高于行均值的列名

解决R语言数据框添加lower和greater列的问题

我来帮你搞定这个需求!你的目标是给数据框新增两列,分别标记每行A/B中低于行均值的列名,以及C/D中高于行均值的列名。我们可以通过逐行处理的方式轻松实现,先看看具体的思路和代码:

核心思路

  1. 用apply()函数逐行遍历数据框,对每一行单独做逻辑判断
  2. 针对每行的A、B列,筛选出数值小于该行ms的列名,用逗号拼接成字符串(无符合条件的则设为NA)
  3. 针对每行的C、D列,筛选出数值大于该行ms的列名,同样拼接成字符串(无符合条件则设为NA)
  4. 将处理后的结果合并到原数据框中

完整代码实现

# 先生成原始数据框
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)有两个关键问题:

  1. 在apply的匿名函数里,df$ms是整个列的所有值,而不是当前行的ms,应该用x["ms"]来获取当前行的均值
  2. which(df$ms)本身的逻辑不对,我们需要的是判断当前行的A/B/C/D值和当前行ms的大小关系,而不是找ms的位置

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 22:57:45