从两个数字

时间:2017-02-02 00:17:28

标签: r

编辑注意到一个拼写错误:次要1和异性恋1等于两次,而不是写的一次。

我有一个基因型数据集,它们用两个数字变量(minorpos和heteropos)编码,可以取1或0(标记的存在或不存在)。我想制作第三个变量,将此信息转换为序数变量,以便:

  • 次要1和杂1等于2,
  • 或次要0和杂1等于1,
  • 或次要1和杂0等于1,
  • 或次要0和异性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)

任何帮助将不胜感激。对于这样一个简单的任务来说,这个功能可能太过分了。

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}}