使用“apply”函数循环列时如何获取列的名称

时间:2017-08-21 21:33:05

标签: r apply

我有一个数据框,

  SNP1 <- c("AA","GG","AG")
  SNP2 <- c("AA","CC","AC")
  SNP3 <- c("GG","AA","AG")
  df<- data.frame(SNP1, SNP2, SNP3)
  colnames(df)<- c('rs10000438', 'rs10000500','rs1000055')

使用此数据框df,我想将函数dominant_dummy应用于每列。我使用apply函数,但我发现对于apply函数,当它遍历dataframe的列时,它只提取此列值的vector ,不包括该列的名称。但是在函数dominant_dummy中,它需要具有此语法NCBI_snp_query(names(x))的列的名称。我怎样才能使用apply函数同时提取name of the column函数只是循环?

  library(rsnps)
  dominant_dummy<- function(x){

    SNP_lib<- NCBI_snp_query(names(x))
    NCBI_snp_query(names(x))

    SNP_min<- SNP_lib$Minor
    SNP_name<- SNP_lib$Query

    SNPs=as.character(x)
    SNPs=as.factor(SNPs)



    check<-substr(levels(SNPs)[2],1,1)==SNP_min
    if(!check){
      levels(SNPs)<-c(0,1,1)
      SNPs<-as.numeric(as.character(SNP))
    }else {levels(SNPs)<-c(1,1,0)
    SNPs<-as.numeric(as.character(SNP))}
  }
  df_3levels<-apply(df,2, dominant_dummy)

1 个答案:

答案 0 :(得分:4)

如果您需要名称,此功能将无法与apply一起使用。由于您基本上需要传入data.frame,因此您将不得不手动进行切片(假设您不想更改dominant_dummy

df_3levels<-sapply(1:ncol(df), function(i) dominant_dummy(df[,i, drop=FALSE]))