R语言遍历数据框列查找每行首个1并生成x_time列的实现方法
最高效实现方案
推荐直接使用R基础包的max.col函数,该函数为底层C实现的矢量化运算,性能远高于显式循环或apply族遍历方案,完全匹配你要的「从左到右取首个1的位置」需求。
完整可运行代码
# 示例数据构造 df <- data.frame(x9 = c('$7', '$7', 2, '$7', 1, '$7'), x10 = c('$7', 1, '$7', '$7', '$7', '$7'), x11 = c('$7', '$7', 2, '$7', 1, '$7'), x12 = c(1, 1, 2, '$7', '$7', '$7'), x13 = c('$7', '$7', 2, '$7', 2, '$7')) # 核心运算逻辑 # 1. 指定需要遍历的目标列 target_cols <- paste0("x", 9:13) # 2. 构造是否等于1的逻辑矩阵(因列包含字符串$7,整列为字符型,故用"1"匹配) match_matrix <- df[, target_cols] == "1" # 3. 取每行第一个匹配项的位置,全不匹配的行设为NA first_match_pos <- max.col(match_matrix, ties.method = "first") first_match_pos[rowSums(match_matrix) == 0] <- NA # 4. 位置映射为对应时间值(第1列x9对应9=1+8,以此类推) df$x_time <- first_match_pos + 8
输出结果验证
运行后得到的df和你给出的期望输出完全一致:
x9 x10 x11 x12 x13 x_time 1 $7 $7 $7 1 $7 12 2 $7 1 $7 1 $7 10 3 2 $7 2 2 2 NA 4 $7 $7 $7 $7 $7 NA 5 1 $7 1 $7 2 9 6 $7 $7 $7 $7 $7 NA
补充说明
如果你的实际数据中对应列是纯数值型(没有$7这类字符串),只需要把判断条件改为match_matrix <- df[, target_cols] == 1即可。
内容的提问来源于stack exchange,提问作者Gregory
相关产品推荐
相关产品推荐

