在R语言中按列计算抑郁得分的循环实现问题求助
问题分析与解决方案
你的代码报错核心原因是逻辑错误导致下标越界,同时str_count的用法完全不符合需求,以下是具体问题和修正方案:
原代码的关键错误
str_count使用错误:你没有传入要统计的目标(即当前受试者的答案列),直接统计固定字符串的字符数,完全无法计算对应答案的数量。- 赋值逻辑颠倒:
scores1[,suma_x]=seq用得分值作为列下标,而得分可能远超过你初始化的43列(比如原代码计算出的suma_x会是107),直接触发下标越界;正确逻辑应该是把得分赋值给对应受试者的列。 - 列名不匹配:初始化的
scores1列名是V1-V43,但原数据列名是Person类,后续无法正确对应。
修正后的代码(循环版)
适合你原来的思路,修正逻辑错误:
# 定义答案与分数的映射规则 score_map <- c( "Not at all" = 0, "Several days" = 1, "More than half the days" = 2, "Nearly every day" = 3 ) # 初始化结果矩阵,列数与原数据一致,列名同步原数据 scores1 <- matrix(nrow = 1, ncol = ncol(t_dep_base), dimnames = list(NULL, colnames(t_dep_base))) # 遍历每个受试者的列,计算总分 for (col_name in colnames(t_dep_base)) { # 获取当前受试者的所有答案 answers <- t_dep_base[, col_name] # 将答案映射为分数后求和(na.rm=TRUE处理可能的缺失值) total_score <- sum(score_map[answers], na.rm = TRUE) # 把总分赋值到结果矩阵的对应列 scores1[, col_name] <- total_score } # 查看最终结果 scores1
更高效的向量化实现(推荐)
R中尽量避免循环,用向量化操作更快:
score_map <- c( "Not at all" = 0, "Several days" = 1, "More than half the days" = 2, "Nearly every day" = 3 ) # 直接将矩阵元素映射为分数,再按列求和,最后转为单行矩阵 scores1 <- matrix(colSums(score_map[t_dep_base], na.rm = TRUE), nrow = 1, dimnames = list(NULL, colnames(t_dep_base))) scores1
运行后就能得到你期望的格式:每行对应总分,每列对应受试者。
内容的提问来源于stack exchange,提问作者AlmaJ
相关产品推荐
相关产品推荐

