首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用apply()操作多列

使用apply()操作多列
EN

Stack Overflow用户
提问于 2017-06-26 06:17:59
回答 1查看 293关注 0票数 0

我有一个跨标签的频率表,其中的测量是CAG,列A01,A02等是频率计数。即13CAG 6485项,CAG 14项35项。

我试着:

  1. 将A01、A02等中的所有值设置为该列中最高值的<0.2 (即不包括那些未达到20%阈值的值)。
  2. 通过将列中的每个值除以该列中所有值的总和来规范A01、A02等中的每个值。这将为列中的每一行提供介于0-1之间的值。
  3. 将A01、A02等中的每个值乘以CAG的变化。CAG中的变化是CAG列中减去模态CAG值的值。
  4. 然后,我需要对每一列中的所有值进行求和。

我在这里尝试过,但不幸的是,我不知道如何取得更大的进步。会很感激你的帮助!

代码语言:javascript
复制
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)

好消息!我现在让它发挥作用,并给出正确的结果。非常感谢!我肯定是在什么地方打错字了。我只是从头开始。这是工作代码:

代码语言:javascript
复制
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,')])')))
}))

我一直在尝试理解您的每个功能行是做什么的,但我仍然不确定。对于我的教育,我不认为你能让我知道每个人都在做什么?再次感谢您!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-26 07:46:42

嗨,虽然这是可能的,但我不会使用基R进行数据操作。为此,我将使用data.table或dplyr包。

我必须指出,这不是唯一的方法,数据表的开销必须考虑在内,然后在上述两个包之间作出决定。

因为您有n数量的列,所以我认为.SD.SDcols的使用在data.table术语中是需要的。例如,假设有A01到A0n列。然后你就可以拥有:

代码语言:javascript
复制
colsToBeUsed=names(data[,!('CAG')])  

data[ , lapply(.SD, {your formula as a function}), .SDCols=c(colsToBeUsed)]

无论如何,在基本的R中,lapply比for循环更快,这就是为什么我建议使用lapply。

在收到关于编写代码的方法的评论之后,我提供了两个选项:第一个是for循环:

代码语言:javascript
复制
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,")])")))
  }

第二,适用于:

代码语言:javascript
复制
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,')])')))
  }))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44753999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档