我如何告诉 R 将函数应用于多个数据?
How can I tell R to apply functions to multiple data?
这个作品我堆了好久,尝试了很多方法都没有成功。
我想要的是将以下 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 个数据?
提前致谢!
有很多选项,这里是仅使用基本函数的选项:
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})
如果我理解这个问题,那么您最终是在询问您的 'data2' 变量以及如何将它们合并在一起?我认为您遇到的问题是您在每次循环迭代中设置 data2 <- NULL
。下面提议的解决方案将此定义移到循环之外,并且对 rbind()
的调用现在应该将所有数据帧一起附加到 return 合并数据集。
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)
您可以使用 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)
或者,如果您不想在 .GlobalEnv
中使用函数 fun
,请使用 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
})
我假设您的 data1、...、dataN 是存储在目录中的文件,并且您一次读取一个。他们也有相同的 header.
您可以做的是一次导入一个,然后执行您想要的操作,如您所述:
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="")
)
这个作品我堆了好久,尝试了很多方法都没有成功。
我想要的是将以下 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 个数据?
提前致谢!
有很多选项,这里是仅使用基本函数的选项:
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})
如果我理解这个问题,那么您最终是在询问您的 'data2' 变量以及如何将它们合并在一起?我认为您遇到的问题是您在每次循环迭代中设置 data2 <- NULL
。下面提议的解决方案将此定义移到循环之外,并且对 rbind()
的调用现在应该将所有数据帧一起附加到 return 合并数据集。
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)
您可以使用 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)
或者,如果您不想在 .GlobalEnv
中使用函数 fun
,请使用 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
})
我假设您的 data1、...、dataN 是存储在目录中的文件,并且您一次读取一个。他们也有相同的 header.
您可以做的是一次导入一个,然后执行您想要的操作,如您所述:
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="")
)