使用R中unfold()函数时遇强制转换NA及0观测数据框问题求助
使用unfold函数处理Rossi数据集时出现空数据框与NA转换警告的解决方法
问题现象
复现Cox比例风险回归实验时,调用RcmdrPlugin.survival包的unfold函数出现以下问题:
- 弹出警告:
Warning in lapply(data, as.numeric) : NAs introduced by coercion - 首次运行代码无异常,后续生成的
Rossi.2为包含14个变量但0条观测的空数据框 - 已重装升级XQuartz、
RcmdrPlugin.survival包并多次重启R,问题未解决
执行代码
url <- "http://socserv.mcmaster.ca/jfox/Books/Companion/data/Rossi.txt" Rossi <- read.table(url, header = TRUE) library(survival) library(RcmdrPlugin.survival) Rossi.2 <- unfold(Rossi, time= "week", event="arrest", cov=11:62, cov.names="employed")
问题根源与解决步骤
1. 数据读取不完整(核心原因)
Rossi数据集包含62列(前10列是基础变量,后52列为emp1至emp52),若read.table未正确读取全部列,会导致cov=11:62指定的列索引超出数据集范围,unfold无法找到对应数据,最终生成空数据框。
修正方法:指定制表符分隔符(原数据集为制表符分隔),确保完整读取:
Rossi <- read.table(url, header = TRUE, sep = "\t") # 验证列数,应返回62 ncol(Rossi)
2. cov.names参数设置错误
代码中cov.names="employed"仅指定了一个名称,但cov=11:62对应52列变量,名称数量不匹配会引发内部处理异常,同时NA警告也与此相关(函数尝试强制转换不匹配的列类型)。
修正方法:为52列变量指定对应名称,或省略该参数让函数自动命名:
# 方法1:自定义命名 Rossi.2 <- unfold(Rossi, time= "week", event="arrest", cov=11:62, cov.names=paste0("employed_", 1:52)) # 方法2:省略cov.names,使用默认命名 Rossi.2 <- unfold(Rossi, time= "week", event="arrest", cov=11:62)
3. 验证结果
运行修正后的代码后,检查Rossi.2的观测数:
nrow(Rossi.2) # 应返回非0数值
内容的提问来源于stack exchange,提问作者Sofiass
相关产品推荐
相关产品推荐

