编辑注意到一个拼写错误:次要1和异性恋1等于两次,而不是写的一次。
我有一个基因型数据集,它们用两个数字变量(minorpos和heteropos)编码,可以取1或0(标记的存在或不存在)。我想制作第三个变量,将此信息转换为序数变量,以便:
这是一个要开始的数据集:
id <- c(1,2,3)
BDNF_minorpos <- c(0, 1, 0)
BDNF_heteropos <- c(1,1,0)
EGFR_minorpos <- c(0,0,1)
EGFR_heteropos <- c(0,0,0)
mydata<-data.frame(BDNF_minorpos, BDNF_heteropos, EGFR_minorpos, EGFR_heteropos)
看起来像:
> data.frame(BDNF_minorpos, BDNF_heteropos, EGFR_minorpos, EGFR_heteropos)
BDNF_minorpos BDNF_heteropos EGFR_minorpos EGFR_heteropos
1 0 1 0 0
2 1 1 0 0
3 0 0 1 0
我尝试创建一个函数来完成这项工作,但我正在努力使用ifelse语法。这是我在R创建的第一个函数。
genotypesToOrdinals <- function(variables, data){
for (i in variables)
var_minor <- paste(i, "_minorpos")
var_hetero <- paste(i, "_heteropos")
x<- ifelse( (var_minor=0) & (var_hetero=0), 0,
ifelse(var_minor=0) & (var_hetero=1), 1,
ifelse(var_minor=1) & (var_hetero=0), 1,
ifelse(var_minor=1) & (var_hetero=1), 2)
data <- x
return (data)
}
我要实现的是传递变量的名称(p.ex.BDNF和EGFR),然后该函数应该找到BDNF_minorpos和BDNF_heteropos,并创建一个新变量来保存0,1或2。它也应该处理NA,如果缺少它,它应该NA条目。
我想用以下函数调用该函数:
genotypesToOrdinals(c("BDNF","EGFR"),mydata)
到目前为止,我收到了错误:
Error in ifelse((var_minor = 0) & (var_hetero = 0), 0, ifelse(var_minor = 0) & :
unused arguments (1, ifelse(var_minor = 1) & (var_hetero = 0), 1, ifelse(var_minor = 1) & (var_hetero = 1), 2)
任何帮助将不胜感激。对于这样一个简单的任务来说,这个功能可能太过分了。
答案 0 :(得分:4)
问题编辑后更新
您可以在每一行使用rowSums
。
genotypesToOrdinals <- function(variables, data){
rowSums( data[, c(paste0(variables, c("_minorpos", "_heteropos")))] )
}
mydata$newBDNF <- genotypesToOrdinals("BDNF", mydata)
mydata$newEGFR <- genotypesToOrdinals("EGFR", mydata)
mydata
# BDNF_minorpos BDNF_heteropos EGFR_minorpos EGFR_heteropos newBDNF newEGFR
# 1 0 1 0 0 1 0
# 2 1 1 0 0 2 0
# 3 0 0 1 0 0 1
答案 1 :(得分:3)
stem <- c("BDNF","EGFR")
ordfun <- function(data,stem) c(0,1,1,2)[interaction(data[paste(stem,c("minorpos","heteropos"),sep="_")])]
mydata[paste(stem,"new",sep="_")] <- Map(ordfun, stem=stem, data=list(mydata))
mydata
# BDNF_minorpos BDNF_heteropos EGFR_minorpos EGFR_heteropos BDNF_new EGFR_new
#1 0 1 0 0 1 0
#2 1 1 0 0 2 0
#3 0 0 1 0 0 1
的另一种用途:
interaction(mydata[paste("BDNF",c("minorpos","heteropos"),sep="_")])
#[1] 0.1 1.1 0.0
#Levels: 0.0 1.0 0.1 1.1
c(0,1,1,2)[interaction(mydata[paste("BDNF",c("minorpos","heteropos"),sep="_")])]
#[1] 1 2 0
说明其工作原理:
{{1}}