【问题标题】:Running a function that renames dataframes per intermediate step, for a list of dataframes运行一个函数,在每个中间步骤重命名数据帧,以获得数据帧列表
【发布时间】:2019-05-04 13:00:38
【问题描述】:

我得到了使用 vegan 包在 R 中进行分析的说明(关于 DCA)。

单个数据帧的说明非常简单,但我想将分析应用于一组数据帧。

我知道这可以通过 for 循环或 lapplysapply 来完成,但我无法处理这样一个事实,即分析的每个步骤都会在数据帧的名称中添加一个新的扩展名。

以下示例

假设我有一个数据框DF,那么它如下:

DF.t1 <- decostand(DF, "total")
DF.t2 <- decostand(DF.t1, "max")
DF.t2.dca <- decorana(DF.t2)
DF.t2.dca.DW <- decorana(DF.t2, iweigh=1)
names(DF.t2.dca)
summary(DF.t2.dca)
DF.t2.dca.taxonscores <- scores(DF.t2.dca, display=c("species"), choices=c(1,2))
DF.t2.dca.taxonscores <- DF.t2.dca$cproj[ ,1:2]
DF.t2.dca.samplescores <- scores(DF.t2.dca, display=c("sites"), choices=1)

我想要实现的是通过这个分析运行几个数据帧,而不是单独写出来。

假设我有一组名为“DF_1”、“DF_2”和“DF_3”的数据帧,我想对其进行分析。

我可能需要将数据帧放在一个列表中,并在 for 循环或 apply 方法之一中获取所有步骤。 但是如何解决在数据帧名称中添加扩展名(.ra、.t1、.t2、.t2.dca、.t2.dca.DW 等)的问题?

编辑:我需要保留分析后的原始数据框,以便对其进行后续分析。

【问题讨论】:

  • 循环结束后是否需要保留所有这些不同的数据帧?
  • @Elin 是的,这个分析是在分叉之前进行的;它根据分数确定应在数据帧上使用两个后续分析(CCA 或 RDA)中的哪一个。后续行动的结构与此分析相似。

标签: r list function dataframe lapply


【解决方案1】:

除非您的数据帧数量非常有限,否则我不建议您定义 ca.全局环境中的每个数据帧都有 8 个新对象,因为这可能会变得非常混乱。

您可能会考虑的一种方法是创建一个嵌套列表,其中第一级是数据框,第二级是修改后的数据框。

# some example data sets
DF1 <- mtcars
DF2 <- mtcars*2
DF3 <- mtcars*3

all_dfs <- list(DF1 = DF1, DF2 = DF2, DF3 =DF3)

some_stuff <- function(df) {
  DF.t1 <- decostand(df, "total")
  DF.t2 <- decostand(DF.t1, "max")
  DF.t2.dca <- decorana(DF.t2)
  DF.t2.dca.DW <- decorana(DF.t2, iweigh=1)
  names(DF.t2.dca)
  summary(DF.t2.dca)
  DF.t2.dca.taxonscores <- scores(DF.t2.dca, display=c("species"), choices=c(1,2))
  DF.t2.dca.taxonscores <- DF.t2.dca$cproj[ ,1:2]
  DF.t2.dca.samplescores <- scores(DF.t2.dca, display=c("sites"), choices=1)
  return(list(DF.t1 = DF.t1, DF.t2 = DF.t2, 
              DF.t2.dca = DF.t2.dca,
              DF.t2.dca.DW = DF.t2.dca.DW, 
              DF.t2.dca.taxonscores = DF.t2.dca.taxonscores, 
              DF.t2.dca.taxonscores = DF.t2.dca.taxonscores
              ))
}

nested_list <- lapply(all_dfs, some_stuff)

# To obtain any of the objects for a specific data.frame you could, for example, run
nested_list$DF1$DF.t2.dca.DW

【讨论】:

  • 谢谢,这行得通,我想我明白它为什么行得通了。你的第一句话到底是什么意思?
  • 假设您有 100 个数据帧,并且将在全局环境中为每个数据帧存储 8 个对象。然后,您将在全局环境中定义 800 个非结构化对象,对这 800 个对象进行任何分析都会非常麻烦。如果您有一个嵌套列表,则您只定义了一个对象,并且可以通过例如跨 data.frames 轻松地执行相同的操作。 lapply。打个比方,这就像把 100 张纸放在桌子上,而不是把它们装订成按章节/主题分类的书。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-22
  • 2021-11-02
  • 1970-01-01
相关资源
最近更新 更多