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

在R语言中为数据框每行提取符合条件的首列:首列含0且后续所有列均为0

解决方案:为R数据框添加符合条件的churn列

首先先重现你提供的数据集:

one = c(0, 2, 1, 3, 0, 5)
two = c(0, 2, 1, 3, 0, 0)
three = c(1, 0, 8, 0, 5, 0)
four = c(3, 0, 0, 7, 9, 0)
df <- data.frame(one, two, three, four)

按照你的需求,我们需要找到每一行中第一个满足“当前列值为0,且该列之后所有列的总和为0”的列名,没有符合条件的则填入空字符串。下面是具体实现方法:

方法一:基础R的apply函数

我们可以定义一个处理单行数据的函数,再用apply逐行应用:

# 定义处理单行的函数
find_churn_col <- function(row) {
  col_names <- names(df)
  # 遍历每一列
  for (col_idx in seq_along(col_names)) {
    # 检查当前列是否为0
    if (row[col_idx] == 0) {
      # 检查当前列之后所有列的和是否为0
      if (sum(row[(col_idx + 1):length(row)]) == 0) {
        return(col_names[col_idx])
      }
    }
  }
  # 没有符合条件的列时返回空字符串
  return("")
}

# 新增churn列
df$churn <- apply(df, 1, find_churn_col)

运行后查看结果,完全符合你的要求:

df
#   one two three four  churn
# 1   0   0     1    3       
# 2   2   2     0    0  three
# 3   1   1     8    0   four
# 4   3   3     0    7       
# 5   0   0     5    9       
# 6   5   0     0    0    two

方法二:使用dplyr(tidyverse风格)

如果你习惯用tidyverse的语法,也可以用rowwise()来实现:

library(dplyr)

df <- df %>%
  rowwise() %>%
  mutate(churn = {
    # 把当前行的值转为向量
    row_values = c(one, two, three, four)
    col_names = c("one", "two", "three", "four")
    result = ""
    # 遍历列寻找符合条件的列名
    for (i in seq_along(col_names)) {
      if (row_values[i] == 0 && sum(row_values[(i+1):length(row_values)]) == 0) {
        result = col_names[i]
        break # 找到第一个符合条件的就停止遍历
      }
    }
    result
  }) %>%
  ungroup()

这个方法也会得到和上面完全一致的结果。

思路解释

两种方法的核心逻辑都是:

  1. 对每一行数据,逐个检查每一列;
  2. 先判断当前列的值是否为0;
  3. 如果是0,再检查该列之后所有列的总和是否为0;
  4. 找到第一个满足条件的列就返回列名,否则返回空字符串。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 13:07:34