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

按行检测指定列区间连续非NA值并生成衍生列的R实现需求

R实现行内连续非NA值检查及衍生列生成

示例数据

df <- data.frame(
  New=c("X2", "k5", "N30","N40", "K5", "S12", "K5", "K5"),
  K_10=c(NA, NA, 3, 4,0,2,NA, NA), 
  K_11=c(NA, NA, NA, 4,0,3,NA, NA), 
  K_12=c(NA, 2, NA, NA,0,NA,NA,0), 
  K_13=c(0, 3, 5, NA,0,5,NA,NA), 
  K_14=c(NA, 3, 1, 2,10,10,NA,NA),
  K_15=c(NA, 2, 3, 5,15,10,NA,2),
  K_16=c(NA, 10, 1, 6,43,10,NA,56),
  K_17=c(NA, 5, 1, 3,1,10,NA,23),
  K_18=c(NA, 6, 4, 2,0,10,NA,12),
  K_19=c(NA, 3, 8, NA,3,10,NA,90),
  K_20=c(NA, 3, 19, 2,6,10,NA,59),
  K_21=c(NA, 3, 10, 2,8,10,NA,11),
  K_22=c(NA, 3, NA, 2,9,10,NA,10),
  K_23=c(NA, 3, NA, 2,90,10,NA,9)
)

需求说明

  • 新增列Con_11_18:按行检查K_11至K_18区间是否存在至少6个连续非NA值,满足则为TRUE,否则为FALSE;
  • 新增列Con_11_18_New:仅针对New="k5"和New="K5"的行执行上述连续非NA值检查,其他行标记为"Not applicable";
  • 新增列count_NA_11_18_New:仅对满足连续非NA值条件的行,统计K_11至K_18区间内的NA数量,不满足条件的行标记为"Not applicable"。

预期输出

df_new <- data.frame(
  New=c("X2", "k5", "N30","N40", "K5", "S12", "K5", "K5"),
  K_10=c(NA, NA, 3, 4,0,2,NA, NA), 
  K_11=c(NA, NA, NA, 4,0,3,NA, NA), 
  K_12=c(NA, 2, NA, NA,0,NA,NA,0), 
  K_13=c(0, 3, 5, NA,0,5,NA,NA), 
  K_14=c(NA, 3, 1, 2,10,10,NA,NA),
  K_15=c(NA, 2, 3, 5,15,10,NA,2),
  K_16=c(NA, 10, 1, 6,43,10,NA,56),
  K_17=c(NA, 5, 1, 3,1,10,NA,23),
  K_18=c(NA, 6, 4, 2,0,10,NA,12),
  K_19=c(NA, 3, 8, NA,3,10,NA,90),
  K_20=c(NA, 3, 19, 2,6,10,NA,59),
  K_21=c(NA, 3, 10, 2,8,10,NA,11),
  K_22=c(NA, 3, NA, 2,9,10,NA,10),
  K_23=c(NA, 3, NA, 2,90,10,NA,9),
  Con_11_18=c(FALSE, TRUE, TRUE, FALSE,TRUE,TRUE,FALSE,FALSE),
  Con_11_18_New=c("Not applicable", TRUE, "Not applicable", "Not applicable",TRUE, "Not applicable","FALSE","FALSE"),
  count_NA_11_18_New=c("Not applicable", 1,2, 2,0,1,"Not applicable","Not applicable")
)

print(df_new)

输出结果:

New K_10 K_11 K_12 K_13 K_14 K_15 K_16 K_17 K_18 K_19 K_20 K_21 K_22 K_23 Con_11_18  Con_11_18_New count_NA_11_18_New
1  X2   NA   NA   NA    0   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA     FALSE Not applicable     Not applicable
2  k5   NA   NA    2    3    3    2   10    5    6    3    3    3    3    3      TRUE           TRUE                  1
3 N30    3   NA   NA    5    1    3    1    1    4    8   19   10   NA   NA      TRUE Not applicable                  2
4 N40    4    4   NA   NA    2    5    6    3    2   NA    2    2    2    2     FALSE Not applicable                  2
5  K5    0    0    0    0   10   15   43    1    0    3    6    8    9   90      TRUE           TRUE                  0
6 S12    2    3   NA    5   10   10   10   10   10   10   10   10   10   10      TRUE Not applicable                  1
7  K5   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA     FALSE          FALSE     Not applicable
8  K5   NA   NA    0   NA   NA    2   56   23   12   90   59   11   10    9     FALSE          FALSE     Not applicable

解决方案代码

# 安装并加载dplyr包(如果未安装)
if (!require(dplyr)) {
  install.packages("dplyr")
  library(dplyr)
}

# 定义函数:检查一行是否存在至少n个连续非NA值
has_consec_non_na <- function(row, n = 6) {
  binary <- as.integer(!is.na(row))
  runs <- rle(binary)
  any(runs$lengths[runs$values == 1] >= n)
}

# 定义函数:统计一行中的NA数量
count_na <- function(row) {
  sum(is.na(row))
}

# 批量处理数据
df_new <- df %>%
  rowwise() %>%
  mutate(
    # 生成Con_11_18列
    Con_11_18 = has_consec_non_na(c_across(K_11:K_18)),
    # 生成Con_11_18_New列
    Con_11_18_New = case_when(
      New %in% c("k5", "K5") ~ as.character(has_consec_non_na(c_across(K_11:K_18))),
      TRUE ~ "Not applicable"
    ),
    # 生成count_NA_11_18_New列
    count_NA_11_18_New = case_when(
      has_consec_non_na(c_across(K_11:K_18)) ~ as.character(count_na(c_across(K_11:K_18))),
      TRUE ~ "Not applicable"
    )
  ) %>%
  ungroup()

# 修正Con_11_18_New的大小写,匹配预期输出
df_new$Con_11_18_New <- ifelse(df_new$Con_11_18_New == "FALSE", "FALSE", df_new$Con_11_18_New)

# 转换count列的类型为混合数值/字符
df_new$count_NA_11_18_New <- ifelse(
  df_new$count_NA_11_18_New != "Not applicable",
  as.integer(df_new$count_NA_11_18_New),
  df_new$count_NA_11_18_New
)

print(df_new)

代码说明

  1. has_consec_non_na函数:将行数据转换为二进制标识(非NA=1,NA=0),通过rle()计算连续值的长度,判断是否存在符合要求的连续非NA段;
  2. count_na函数:统计指定行内的NA数量;
  3. dplyr流水线处理:
    • rowwise()指定按行处理数据;
    • c_across(K_11:K_18)快速提取目标区间的列;
    • case_when()根据条件逻辑生成对应列的内容;
  4. 最后调整部分标记的格式和列类型,确保与预期输出完全匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 09:59:57