R语言循环报错‘argument is of length zero’:统计变量为1的次数求解决
解决R语言中"argument is of length zero"报错并实现行内计数需求
报错原因分析
- 列名不匹配:你定义的
prv_services向量用了大写列名("PRV_SERV_1"),但示例数据里的列名是小写("prv_serv_1")。如果真实数据集的列名和向量中的名称不一致,data[val, c]会返回空值,触发"argument is of length zero"错误。 - 循环逻辑遗漏赋值:你在循环中计算了
the.sum,但没有将结果赋值给data$prv_services[val],即便没有报错也无法得到预期的累计计数。 - 变量名冲突:循环中使用
c作为迭代变量,而c是R的内置函数,可能引发意外逻辑问题。
修复方案
方案1:修正循环代码
先确保prv_services中的列名和数据集data的列名完全一致,然后调整循环逻辑:
# 先确保列名匹配(示例用小写) prv_services <- c("prv_serv_1", "prv_serv_2") # 初始化结果列 data$prv_services_count <- NA for (val in 1:nrow(data)) { the.sum <- 0 # 改用sv作为迭代变量,避免和内置函数c冲突 for (sv in prv_services){ current_val <- data[val, sv] # 先判断是否存在该列(防止列名错误) if (!is.null(current_val)) { if (!is.na(current_val) && current_val != "D" && current_val != "R") { if (as.numeric(current_val) == 1) { the.sum <- the.sum + 1 } } } } # 将计算结果赋值给对应行 data$prv_services_count[val] <- the.sum }
方案2:用rowSums高效实现(推荐)
循环在R中效率较低,推荐用rowSums结合条件判断实现需求,同时处理NA、"D"、"R"的情况:
# 先将目标列转换为数值型,同时把"D"、"R"设为NA target_cols <- data[, prv_services] target_cols[target_cols == "D" | target_cols == "R"] <- NA target_cols <- as.data.frame(lapply(target_cols, as.numeric)) # 计算每行等于1的数量(自动忽略NA) data$prv_services_count <- rowSums(target_cols == 1, na.rm = TRUE)
示例验证
用你提供的示例数据测试:
# 构建示例数据集 Services <- c("prv_serv_1", "prv_serv_2") Patient_ID <- c("A", "B" , "C") Obs_1 <-c(0, 1) Obs_2 <-c(1, 1) Obs_3 <-c(1, 0) Services_Matrix <- rbind(Obs_1, Obs_2, Obs_3) colnames(Services_Matrix) <- Services rownames(Services_Matrix) <- Patient_ID # 转换为data.frame data <- as.data.frame(Services_Matrix) # 用方案2测试 prv_services <- c("prv_serv_1", "prv_serv_2") target_cols <- data[, prv_services] target_cols <- as.data.frame(lapply(target_cols, as.numeric)) data$prv_services_count <- rowSums(target_cols == 1, na.rm = TRUE)
运行后data会新增prv_services_count列,结果为:
prv_serv_1 prv_serv_2 prv_services_count A 0 1 1 B 1 1 2 C 1 0 1
内容的提问来源于stack exchange,提问作者four77
相关产品推荐
相关产品推荐

