在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()
这个方法也会得到和上面完全一致的结果。
思路解释
两种方法的核心逻辑都是:
- 对每一行数据,逐个检查每一列;
- 先判断当前列的值是否为0;
- 如果是0,再检查该列之后所有列的总和是否为0;
- 找到第一个满足条件的列就返回列名,否则返回空字符串。
内容的提问来源于stack exchange,提问作者Rime Laafia
相关产品推荐
相关产品推荐

