如何解决UseMethod("mutate")报错:无适用于numeric类对象的mutate方法?
问题描述
我有一个CSV格式文件,包含samples和status(取值为pLGG、healthy)两列。想要将status列二值化:pLGG样本设为1,healthy样本设为0以便后续分析,但使用dplyr的mutate函数时出现报错,以下是代码及报错信息:
代码1及报错
traitData = read.csv("traits.csv") datTraits = as.data.frame(traitData) rownames(datTraits)=traitData$sample datTraits = subset(datTraits , select = -c(1)) collectGarbage() library(dplyr) traits = datTraits mutate(disease_state_bin = ifelse(grepl("pLGG" , traits$status),1,0))
报错信息:
Error in UseMethod("mutate") : no applicable method for 'mutate' applied to an object of class "c('double', 'numeric')"
调整后的代码2及报错
library(dplyr) library(zoo) mutate(disease_state_bin = ifelse(grepl("pLGG" , as.character(datTraits$status),1,0)))
报错信息:
Error in ifelse(grepl("pLGG", as.character(datTraits$status), 1, 0)) : argument "yes" is missing, with no default
错误原因及解决方案
错误1原因
mutate是dplyr中用于修改数据框的函数,必须明确指定要操作的数据框对象。代码1中直接调用mutate(...),没有传入数据框,导致函数把参数识别为数值类型,从而抛出“无适用方法”的错误。
错误2原因
ifelse的语法是ifelse(test, yes, no),你错误地把1和0放到了grepl的参数位置(grepl的第三个参数是fixed,用于指定是否精确匹配字符串),导致ifelse缺少必填的yes和no参数,引发报错。
正确代码示例
方法1:使用dplyr管道语法(推荐)
library(dplyr) # 读取并预处理数据 traitData <- read.csv("traits.csv") datTraits <- as.data.frame(traitData) rownames(datTraits) <- traitData$sample datTraits <- subset(datTraits, select = -c(1)) # 生成二值化列 datTraits <- datTraits %>% mutate(disease_state_bin = ifelse(status == "pLGG", 1, 0))
方法2:直接指定数据框给mutate
library(dplyr) # 预处理步骤同上... datTraits <- mutate(datTraits, disease_state_bin = ifelse(grepl("pLGG", status), 1, 0))
方法3:更简洁的二值化写法(因status只有两个取值)
library(dplyr) # 预处理步骤同上... datTraits <- datTraits %>% mutate(disease_state_bin = as.integer(status == "pLGG"))
内容的提问来源于stack exchange,提问作者Sara Tavallaei
相关产品推荐
相关产品推荐

