我有一个跨标签的频率表,其中的测量是CAG,列A01,A02等是频率计数。即13CAG 6485项,CAG 14项35项。
我试着:
我在这里尝试过,但不幸的是,我不知道如何取得更大的进步。会很感激你的帮助!
data <- data.frame(CAG = c(13, 14, 15, 17),
A01 = c(6485,35,132, 12),
A02 = c(0,42,56, 4))
iithreshold <- 0.2
ii <- lapply(data[, 8:ncol(height)], function(x) {
mod <- data$CAG[which.max(x)]
x < (iithreshold * max(x)) <- 0
ii2 <- (x / sum (x)) * (height$CAG - mod)
})
ii3 <- sum(ii2)
ii3 <- as.data.frame(ii3)
ii3 <- t(ii3)好消息!我现在让它发挥作用,并给出正确的结果。非常感谢!我肯定是在什么地方打错字了。我只是从头开始。这是工作代码:
library(data.table)
dataDT <- data.frame(height[,7:ncol(height)])
dataDT <- setDT(dataDT)
iithreshold <- 0.2
colsToBeUsed<-names(dataDT[,!'CAG'])
sumDataSetdata<-c()
iiht<-unlist(lapply(X=1:length(colsToBeUsed),function(X){s=colsToBeUsed[X]
eval(parse(text=paste0('dataDT[',s,'<iithreshold*max(',s,'),',s,':=0]')))
eval(parse(text=paste0('dataDT[,MAX',s,':=dataDT[',s,'==max(',s,'),CAG]]')))
eval(parse(text=paste0('dataDT[,norm',s,':=',s,'/sum(',s,')]')))
eval(parse(text=paste0('dataDT[,sum',s,':=',s,'/sum(',s,')*(CAG-MAX',s,'),]')))
eval(parse(text=paste0('rbind(sumDataSetdata,dataDT[,sum(sum',s,')])')))
}))我一直在尝试理解您的每个功能行是做什么的,但我仍然不确定。对于我的教育,我不认为你能让我知道每个人都在做什么?再次感谢您!
发布于 2017-06-26 07:46:42
嗨,虽然这是可能的,但我不会使用基R进行数据操作。为此,我将使用data.table或dplyr包。
我必须指出,这不是唯一的方法,数据表的开销必须考虑在内,然后在上述两个包之间作出决定。
因为您有n数量的列,所以我认为.SD和.SDcols的使用在data.table术语中是需要的。例如,假设有A01到A0n列。然后你就可以拥有:
colsToBeUsed=names(data[,!('CAG')])
data[ , lapply(.SD, {your formula as a function}), .SDCols=c(colsToBeUsed)]无论如何,在基本的R中,lapply比for循环更快,这就是为什么我建议使用lapply。
在收到关于编写代码的方法的评论之后,我提供了两个选项:第一个是for循环:
library(data.table)
dataDT<- data.frame(CAG = c(13, 14, 15, 17),
A01 = c(6485,35,132, 12),
A02 = c(0,42,56, 4))
thres <- 0.2
dataDT<-setDT(dataDT)
colsToBeUsed<-names(dataDT[,!'CAG'])
sumDataSetdata<-c()
for(X in colsToBeUsed){
eval(parse(text=paste0("dataDT[",X,"<thres*max(",X,"),",X,":=0]")))
eval(parse(text=paste0("dataDT[,MAX",X,":=dataDT[",X,"==max(",X,"),CAG]]")))
eval(parse(text=paste0("dataDT[,norm",X,":=",X,"/sum(",X,")]")))
eval(parse(text=paste0("dataDT[,sum",X,":=",X,"/sum(",X,")*(CAG-MAX",X,"),]")))
eval(parse(text=paste0("sumDataSetdata<-rbind(sumDataSetdata,dataDT[,sum(sum",X,")])")))
}第二,适用于:
library(data.table)
dataDT<- data.frame(CAG = c(13, 14, 15, 17),
A01 = c(6485,35,132, 12),
A02 = c(0,42,56, 4))
thres <- 0.2
dataDT<-setDT(dataDT)
colsToBeUsed<-names(dataDT[,!'CAG'])
sumDataSetdata<-c()
sumDataSet<-unlist(lapply(X=1:length(colsToBeUsed),function(X){s=colsToBeUsed[X]
eval(parse(text=paste0('dataDT[',s,'<thres*max(',s,'),',s,':=0]')))
eval(parse(text=paste0('dataDT[,MAX',s,':=dataDT[',s,'==max(',s,'),CAG]]')))
eval(parse(text=paste0('dataDT[,norm',s,':=',s,'/sum(',s,')]')))
eval(parse(text=paste0('dataDT[,sum',s,':=',s,'/sum(',s,')*(CAG-MAX',s,'),]')))
eval(parse(text=paste0('rbind(sumDataSetdata,dataDT[,sum(sum',s,')])')))
}))https://stackoverflow.com/questions/44753999
复制相似问题