用功能重复相同的动作并应用familly

时间:2017-07-04 15:22:12

标签: r

我是R的新人(我使用R-studio),我必须分析一个大数据框(10个观察的60个变量)。我的数据框中有一个列名称,其中有许多不同的动物物种。我的工作目标是获得8种不同物种的结果,所以我必须分别在那里工作。 我开始构建不同的子集(比如我在学校学习)和很棒的包(特别感谢dplyr和tdyr)。但是现在我必须对8个物种中的每一个重复许多相同(或几乎相同)的动作,所以我花了很多时间来复制/粘贴,当我犯了错误时,我必须验证并改变数千行的错误。 然后我尝试了解循环和应用族函数。但我不能做点好事。

我用传统方式(组织数据)对一个物种做了一个动作的例子:

espece_td_a <- subset(BDD, BDD$espece == "espece A" & BDD$placette =="TOTAL")%>%
  select(code_site,passage,adulte)%>% 
  spread(passage, adulte)              
  espece_td_a <- full_join(B.irene_td_a, BDD_P3_TOT_site)
  espece_td_a <- replace(espece_td_a, is.na(espece_td_a),0)  
  espece_td_a$P1[B.irene_td_a$P1>0]<-1                       
  espece_td_a$P2[B.irene_td_a$P2>0]<-1
  espece_td_a$P3[B.irene_td_a$P3>0]<-1
  write.csv(espece_td_a, file = "espece_td_a.csv")

BDD是我的数据框架。

BDD_P3_TOT_site是使用BDD构建的向量(或具有1列多行的数据帧?)

这种传统方式&#34;为我工作,但我必须做很多次这样的事情!这需要很多时间......

然后我试着&#34;申请&#34;这有功能:

f <- function(x)
{
  select(code_site, passage, adulte)%>%
    spread(x, x$passage, x$adulte)%>%
    full_join(x, BDD_P3_TOT_site) -> x
  x <- replace(x, is.na(x),0)
  x$P1[x$P1>0]<-1
  x$P2[x$P2>0]<-1
  x$P3[x$P3>0]<-1
}

我希望将此函数应用于我的lapply数据集(列表中有8种):

l <- c("espece_a","espece_b","espece_c")

lapply(l,f(x))

问题:

  • 如果我想把我的物种带入BDD,我知道这是一个错误的配方。

  • 该功能不想工作: 我已经制作了8个子集(对于我感兴趣的每个物种) 在我的全球环境中:espece_a; espece_b ...

然后我想把我的子集逐个放入我的函数中:

> f(espece_a)
  

选择_(。data,.dots = lazyeval :: lazy_dots(...))出错:显示回溯        object&#39; code_site&#39;找不到重新运行调试

我希望我的桌子出现在我的Globlal env中,其名称能让我识别它(例如:&#34; espece_td_a&#34;)

2 个答案:

答案 0 :(得分:0)

您有3个与使用lapply相关的问题:

  1. 您需要在x函数的末尾返回对象f
  2. l应该是数据框列表,而不仅仅是数据框名称的向量,即l <- list(espece_a,espece_b,espece_c)
  3. lapply与现有功能一起使用时,您只需传递该功能的名称,即lapply(l,f)
  4. 希望这可以解决您的问题。

答案 1 :(得分:0)

我解决了功能问题:

f <- function(X){
  X <- select(X, code_site, passage, adulte)%>%
   spread(passage, adulte) 
  X <- full_join(X, BDD_P3_TOT_site)
  X <- replace(X, is.na(X),0)
  X$P1[X$P1>0]<-1
  X$P2[X$P2>0]<-1
  X$P3[X$P3>0]<-1
  X <- return(X)
    }

测试&lt; - f(espece_a)