【问题标题】:loop through a list of dataframe in R and apply if else function循环遍历 R 中的数据框列表并应用 if else 函数
【发布时间】:2012-12-12 17:25:06
【问题描述】:

我有一个数据框列表,并希望通过列表应用 if else 函数

df1= data.frame(letter=LETTERS[1:5], res=runif(10), cens=rep(0:1,5))
df2= data.frame(letter=LETTERS[1:5], res=runif(10), cens=rep(0,5)) 
df3= data.frame(letter=LETTERS[1:5], res=runif(10), cens=rep(0:1,5))
df4= data.frame(letter=LETTERS[1:5], res=runif(10), cens=rep(0,5)) 


df.list=list(df1,df2,df3,df4)

reg.stats = function(var1){
  gm.reg=exp(mean(log(var1)))
  gsd.reg=exp(sd(log(var1)))
  return(c(gm.reg,gsd.reg))
  }

 other.stats = function(obs,cens){
 nondetects <- obs[cens==1]
 detects <- obs[cens== 0]
 gm.other=exp(mean(log(detects)))
 gsd.other=exp(sd(log(detects)))
 return(c(gm.other,gsd.other))
 }

我想遍历每个 df,如果单个 df = 0(即 df2)中 cens 变量的总和,则应用 reg.stats 函数,否则应用 other.stats 函数。

在真实数据集中,我有一个 50+ dfs 的列表,我过去所做的是手动挑选所有 cens = 0 的 dfs 并使用 lapply 函数。没关系,但是如果我分离数据框并为每个列表使用单独的 lapply 然后合并结果,则顺序会更改,然后我需要重新排序结果。有没有更快、更清洁的方法来做到这一点?

  uncens.list = df.list[c(2,4)]
  uncens.res= lapply(uncens.list, function(i) reg.stats(i$res))

  cens.list = df.list[c(1,3)]
  cens.res.=lapply(cens.list,function(i) other.stats(i$res,i$cens))

【问题讨论】:

    标签: r


    【解决方案1】:

    它适用于ifelse,但不适用于ifelse,因为后者只会返回函数结果的第一个值:

    lapply(df.list, function(i) if (sum(i$cens) == 0) reg.stats(i$res) 
                                else other.stats(i$res,i$cens))
    

    结果:

    [[1]]
    [1] 0.402693 1.467128
    
    [[2]]
    [1] 0.3427096 2.4269668
    
    [[3]]
    [1] 0.3731172 1.8051164
    
    [[4]]
    [1] 0.3883753 2.0028039
    

    顺便说一句:不需要单独的功能。这一切都可以在一个命令中完成:

    lapply(df.list, function(i) {detects <- log(i$res[i$cens == 0])
                                 c(exp(mean(detects)), exp(sd(detects)))})
    

    【讨论】:

    • 谢谢。那很简单,但我想不出来。 :_)
    【解决方案2】:

    你看过 package: plyr 吗? http://cran.r-project.org/web/packages/plyr/index.html

    具体来说,函数 llply?

    如果您编写了一个包装函数来确定在给定 cens 值的情况下调用哪个 stats 函数,那么您似乎可以使用该包装函数调用 llply。

    【讨论】:

      猜你喜欢
      • 2021-02-08
      • 2019-01-30
      • 1970-01-01
      • 1970-01-01
      • 2018-09-28
      • 2021-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多