列和唯一ID上的函数和循环

时间:2016-07-27 14:43:04

标签: r loops apply

这是我的数据框:

dput(fase1_M2)
structure(list(CO2 = c(1300L, 1300L, 1300L), Meso = structure(c(1L, 
1L, 1L), .Label = c("M2", "M3", "M4", "M5", "M6", "M7", "M8"), class = "factor"), 
    Days = structure(c(18L, 8L, 2L), .Label = c("T1", "T-1", 
    "T11", "T13", "T15", "T17", "T19", "T-2", "T20", "T21", "T22", 
    "T23", "T24", "T25", "T27", "T29", "T3", "T-3", "T5", "T7", 
    "T9"), class = "factor"), Day = -3:-1, Total.abundance.cell.l = c(8298255, 
    78682211, 175454990), Tot.dinoflagellate.cell.l = c(879200L, 
    1101931L, 4293575L), Tot.diatoms.cell.l = c(7243215, 77580280, 
    171161415), Tot.other.cell.l = c(175840L, 0L, 0L), Amphidinium = c(NA, 
    NA, NA), Karenia.mikimotoi = c(NA, NA, NA), Heteocapsa = c(NA, 
    NA, NA), Gymnodiales = c(879199.999999999, 1101930.66666667, 
    4293574.68013468), Peridinella = c(NA, NA, NA), Prorocentrum = c(NA_real_, 
    NA_real_, NA_real_), Gyrodinium = c(NA, NA, NA), Scripsiella = c(NA, 
    NA, NA), Protoperidinium.bipes = c(NA, NA, NA), Protoperidinium = c(NA, 
    NA, NA), Mesoporos.perforatus = c(NA_real_, NA_real_, NA_real_
    ), Ceratium.fusus = c(NA, NA, NA), Katodinium = c(NA, NA, 
    NA), Gymnodinium = c(NA, NA, NA), Ceratium.lineatum = c(NA, 
    NA, NA), Nitzschia.longissima.min50 = c(NA_real_, NA_real_, 
    NA_real_), Nitzschia.longissima.mag50 = c(NA_real_, NA_real_, 
    NA_real_), Pseudo.nitzschia.min50 = c(NA_real_, NA_real_, 
    NA_real_), Pseudo.nitzschia.mag50 = c(NA_real_, NA_real_, 
    NA_real_), Licmophora = c(488250, NA, NA), Navicula = c(NA, 
    NA, NA), Skeletonema.costatum = c(270825, NA, 2797454.54545454
    ), Guinardia = c(NA, 54950000, NA), Guinardia...20. = c(NA_real_, 
    NA_real_, NA_real_), Dactyliosolen = c(6264300, 22419600, 
    163184848.484849), Thalissiosia.constricta = c(NA, NA, NA
    ), Hemiliaulus.haukii = c(NA, NA, NA), Rhizosolenia = c(NA, 
    NA, NA), Helicotheca = c(NA, NA, NA), Chaetoceros.lorenzianus = c(NA_real_, 
    NA_real_, NA_real_), Chaetoceros.affinis = c(NA_real_, NA_real_, 
    NA_real_), Chaetoceros..10 = c(NA_real_, NA_real_, NA_real_
    ), Chaetoceros..10.1 = c(219840, 210680, 2493555.55555556
    ), Chaetoceros.decipiens = c(NA_real_, NA_real_, NA_real_
    ), Chaetoceros.Didymus = c(NA, NA, NA), Leptocylindrus = c(NA, 
    NA, 2685556.36363636), Asterionellopsis.glacialis = c(NA, 
    NA, NA), Ceratulina = c(NA, NA, NA), Corethron = c(NA, NA, 
    NA), Thalassiosira.nitzschioide = c(NA, NA, NA), Dictyocha = c(NA, 
    NA, NA), Cylindrotheca = c(NA, NA, NA), thalassiosira = c(NA, 
    NA, NA), bacteriastrum.hyalinum = c(NA, NA, NA), Eutripsiella = c(NA, 
    NA, NA), Cryptonomas = c(175840, NA, NA), Olisthodiscus = c(NA, 
    NA, NA), trasparente.quadrato = c(NA, NA, NA), flagellate.rotonde = c(NA, 
    NA, NA), pleurosigma = c(NA, NA, NA), amphidinium.carterae = c(NA_real_, 
    NA_real_, NA_real_), Actinoptychus.octonaria = c(NA, NA, 
    NA), pyramimonas = c(NA, NA, NA), acanthoica.aculata = c(NA, 
    NA, NA), Specie.fionda = c(NA, NA, NA), Asteroplans.Karianus = c(NA, 
    NA, NA), Chaetoceros.Lauderi = c(NA_real_, NA_real_, NA_real_
    ), Chaetoceros.curvisetus = c(NA_real_, NA_real_, NA_real_
    ), Eucampia.Zodiacus = c(NA, NA, NA), Eunotia.clevei = c(NA, 
    NA, NA), Diplopsalis = c(NA, NA, NA), ceratium = c(NA, NA, 
    NA), Raphidophyce = c(NA, NA, NA), Chaetoceros.atlanticus = c(NA, 
    NA, NA), Guinardia.delicatula = c(NA, NA, NA), Leptocylindrus.5 = c(NA_real_, 
    NA_real_, NA_real_)), .Names = c("CO2", "Meso", "Days", "Day", 
"Total.abundance.cell.l", "Tot.dinoflagellate.cell.l", "Tot.diatoms.cell.l", 
"Tot.other.cell.l", "Amphidinium", "Karenia.mikimotoi", "Heteocapsa", 
"Gymnodiales", "Peridinella", "Prorocentrum", "Gyrodinium", "Scripsiella", 
"Protoperidinium.bipes", "Protoperidinium", "Mesoporos.perforatus", 
"Ceratium.fusus", "Katodinium", "Gymnodinium", "Ceratium.lineatum", 
"Nitzschia.longissima.min50", "Nitzschia.longissima.mag50", "Pseudo.nitzschia.min50", 
"Pseudo.nitzschia.mag50", "Licmophora", "Navicula", "Skeletonema.costatum", 
"Guinardia", "Guinardia...20.", "Dactyliosolen", "Thalissiosia.constricta", 
"Hemiliaulus.haukii", "Rhizosolenia", "Helicotheca", "Chaetoceros.lorenzianus", 
"Chaetoceros.affinis", "Chaetoceros..10", "Chaetoceros..10.1", 
"Chaetoceros.decipiens", "Chaetoceros.Didymus", "Leptocylindrus", 
"Asterionellopsis.glacialis", "Ceratulina", "Corethron", "Thalassiosira.nitzschioide", 
"Dictyocha", "Cylindrotheca", "thalassiosira", "bacteriastrum.hyalinum", 
"Eutripsiella", "Cryptonomas", "Olisthodiscus", "trasparente.quadrato", 
"flagellate.rotonde", "pleurosigma", "amphidinium.carterae", 
"Actinoptychus.octonaria", "pyramimonas", "acanthoica.aculata", 
"Specie.fionda", "Asteroplans.Karianus", "Chaetoceros.Lauderi", 
"Chaetoceros.curvisetus", "Eucampia.Zodiacus", "Eunotia.clevei", 
"Diplopsalis", "ceratium", "Raphidophyce", "Chaetoceros.atlanticus", 
"Guinardia.delicatula", "Leptocylindrus.5"), row.names = c(1L, 
8L, 15L), class = "data.frame")

我要做的是应用一个函数,为数据框的每一列计算最终的logaritmo

f=function(x) {
  MIN=apply(x,2,min,na.rm=T)
  MAX=apply(x,2,max,na.rm=T)
  MIN=as.numeric(MIN)
  MAX=as.numeric(MAX)
  logaritmo=log(MAX/MIN)
  t2=which.max( x)
  t1=which.min( x )
  logaritmo/(t2-t1)
}

然后我想将此函数应用于数据框的所有列,以便我为每列提供最终结果logaritmo

我试图使用:

apply(fase1_M2,2,f)

但它不起作用..

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

如果我理解正确,这就是你要找的东西(df是你的数据框):

library(dplyr)

lapply(df, function(x) {
    if(class(x) == "numeric") log((max(x) / min(x) ) / (max(x) - min(x)) )
    else NA
    }
    ) %>% rbind() %>% data.frame() -> tt

输出tt是一个数据框,其中包含max / min的对数除以max和min之间的差值。对于非数字列或包含 NA 的列,它将返回 NA