首页 > 解决方案 > 如何解决 R 中的“.subset2(x, i, exact = exact) 中的错误”问题?

问题描述

我在 R 中使用以下数据框:

ID <- c(LETTERS[1:10])
GLUC <- c(88,NA,110,NA,90,88,120,110,NA,90)
TGL <- c(NA,150,NA,200,210,NA,164,170,190,NA)
HDL <- c(32,60,NA,65,NA,32,NA,70,NA,75)
LDL <- c(99,NA,120,165,150,210,NA,188,190,NA)

patient_num <- data.frame(ID,GLUC,TGL,HDL,LDL)

我想创建一个矩阵,其中 GLUC、TGL、HDL 和 LDL 作为行名,mean、median、sd、n 和 n_miss 作为列名。当我输入以下代码时:

  r <- c(mean(patient_num[[varname]],na.rm=TRUE), 
    median(patient_num[[varname]],na.rm=TRUE), 
    sd(patient_num[[varname]],na.rm=TRUE),
    sum(!is.na(patient_num[[varname]])),
    sum(is.na(patient_num[[varname]]))
    )
  if (length(varname) == 1){
    r <- matrix(r,nrow=T)
  } else{
    for (index in 2:length(varname)){
      oneRow = table1(patient_num,varname[[index]])
      r <- rbind(r,oneRow)
    }
  }
  rownames(r) <- varname
  colnames(r) <- c("mean","median","sd","n","n_miss")
  return(r)
}

table1(patient_num,c("GLUC","TGL","HDL","LDL")) 

我收到一条错误消息:

.subset2(x, i, exact = exact) 中的错误:递归索引在第 2 级失败

似乎无法弄清楚出了什么问题

标签: rmatrix

解决方案


使用sapply()from有一个更简单的解决方案base R

new_df <- sapply(patient_num, function(x) list(
  mean = mean(x, na.rm = T),
  sd = sd(x, na.rm = T),
  n = sum(!is.na(x)),
  is_na = sum(is.na(x))))

t(new_df)

#>     mean     sd       n  is_na
#>ID   NA       NA       10 0    
#>GLUC 99.42857 13.45185 7  3    
#>TGL  180.6667 23.0362  6  4    
#>HDL  55.66667 19.00175 6  4    
#>LDL  160.2857 40.06126 7  3 

如果您只想要每行中非 NA 条目的计数,则可以从中删除IDpatient_num运行相同的代码。

请注意,您可能希望转换new_dfdata.frame.


推荐阅读