如何告诉R将函数应用于多个数据?

时间:2019-03-13 10:00:33

标签: r list function for-loop vegan

我已经将这项工作堆放了很长时间,尝试了不同的方法,但是没有成功。

我想要的是将以下4个函数应用于for循环内或R中的任何30个不同数据(data1,2,3,... data30)。这些数据集具有相同(10)的列号和不同的行。

这是我为第一个数据(data1)编写的代码。它运作良好。

for(i in 1:nrow(data1)){
  data1$simp <-diversity(data1$sp, "simpson")
  data1$shan <-diversity(data1$sp, "shannon")
  data1$E <- E(data1$sp)
  data1$D <- D(data1$sp)
}

我想将此代码用于其他29个数据,以便不重复此过程29次。

以下代码是我现在想做的。但是还是不对。

data.list <- list(data1, data2,data3,data4,data5)
for(i in data.list){
  data2 <- NULL
  i$simp <-diversity(i$sp, "simpson")
  i$shan <-diversity(i$sp, "shannon")
  i$E <- E(i$sp)
  i$D <- D(i$sp)
  data2 <- rbind(data2, i)
  print(data2)
}

所以我想问我如何告诉R将函数应用于其他29个数据?

提前谢谢!

4 个答案:

答案 0 :(得分:0)

有很多选项,这是仅使用基本函数的一种:

data.list <- list(data1, data2, data3, data4, data5)
changed_data <- lapply(data.list, function(my_data) {
    my_data$simp <-diversity(my_data$sp, "simpson")
    my_data$shan <-diversity(my_data$sp, "shannon")
    my_data$E <- E(my_data$sp)
    my_data$D <- D(my_data$sp)
    my_data})

答案 1 :(得分:0)

如果我理解这个问题,那么您最终要问的是“ data2”变量以及如何将所有这些变量合并在一起?我认为您遇到的问题是每次循环迭代都要设置data2 <- NULL。下面提出的解决方案将此定义移出了循环,对rbind()的调用现在应将所有数据帧附加在一起以返回合并的数据集。

data.list <- list(data1, data2,data3,data4,data5) #all 29 can go here
data2 <- NULL
for(i in data.list){

  i$simp <-diversity(i$sp, "simpson")
  i$shan <-diversity(i$sp, "shannon")
  i$E <- E(i$sp)
  i$D <- D(i$sp)
  data2 <- rbind(data2, i)
}
print(data2)

答案 2 :(得分:0)

您可以使用Map进行此操作。

fun <- function(DF){
  for(i in 1:nrow(DF)){
    DF$simp <-diversity(DF$sp, "simpson")
    DF$shan <-diversity(DF$sp, "shannon")
    DF$E <- E(DF$sp)
    DF$D <- D(DF$sp)
  }
  DF
}

result.list <- Map(fun, data.list)

或者,如果您不想在fun中使用.GlobalEnv使用函数lapply

result.list <- lapply(data.list, function(DF){
  for(i in 1:nrow(DF)){
    DF$simp <-diversity(DF$sp, "simpson")
    DF$shan <-diversity(DF$sp, "shannon")
    DF$E <- E(DF$sp)
    DF$D <- D(DF$sp)
  }
  DF
})

答案 3 :(得分:0)

我假设您的data1,...,dataN是存储在目录中的文件,并且您一次读取一个文件。而且它们具有相同的标题。

您可以做的是一次导入一个,然后执行您想要的操作,如您提到的那样:

files <- list.files(directoryPath) #maybe you can grep() some specific files
for (f in files){
  data <- read.table(f) #choose header, sep and so on...
  for(i in 1:nrow(data)){
    data$simp <-diversity(data$sp, "simpson")
    data$shan <-diversity(data$sp, "shannon")
    data$E <- E(data$sp)
    data$D <- D(data$sp)
  }
}

请注意,您必须位于工作目录中,或者在读取表时必须为文件名添加路径(即paste(path, f, sep="")