【问题标题】:Loop DataFrame Production循环 DataFrame 生产
【发布时间】:2015-11-30 20:59:45
【问题描述】:

我希望以自动(循环)方式将大型数据框 (mix1a.df) 分解为许多较小的数据框(例如 drugA.dfdrugB.dfdrugC.df 等)。如何让 R 在初始数据帧mix1a.df 中为它找到的每种药物(列表中的 n 个药物 = n 个数据帧)自动创建一个子数据帧?

例如,现在我通过以下方式为单个数据框提取我想要的信息:

alprazolam.df<-subset(mix1a.df, mix1a.df$Component.name.x == "Alprazolam", 
select=c("Sample.Name", "Component.name.x", "TCAmount", "Ratio"))
alprazolam.df$Sample.Name<-(as.character)(alprazolam.df$Sample.Name)
alprazolam.df$Ratio<-(as.numeric)(alprazolam.df$Ratio)
alprazolam.df$Sample.Name.Level <- substr(alprazolam.df$Sample.Name, 1,2)
alprazolam.df$Sample.Name.Level<-(as.factor)(alprazolam.df$Sample.Name.Level)

理想情况下,在自动化的过程中,类类型也将被转换,如上面的代码所示。

对于一些示例数据:

Sample.Name Component.name TCAmount Ratio 1A-S0 Alprazolam 0.0 0.05 1A-S1 Alprazolam 1.5 0.07 1A-S2 Alprazolam 3.1 0.08 1A-S3 Alprazolam 6.25 0.10 2A-S0 Alprazolam 0.0 0.06 2A-S1 Alprazolam 1.5 0.08 2A-S2 Alprazolam 3.1 0.09 2A-S3 Alprazolam 6.25 0.10 1B-S0 Alprazolam 0.0 0.05 1B-S1 Alprazolam 1.5 0.08 1B-S2 Alprazolam 3.1 0.10 1B-S3 Alprazolam 6.25 0.11 1A-S0 Codeine 0.0 0.10 1A-S1 Codeine 1.5 0.30 1A-S2 Codeine 3.1 0.41 1A-S3 Codeine 6.25 0.62 2A-S0 Codeine 0.0 0.09 2A-S1 Codeine 1.5 0.29 2A-S2 Codeine 3.1 0.40 2A-S3 Codeine 6.25 0.62 1B-S0 Codeine 0.0 0.09 1B-S1 Codeine 1.5 0.28 1B-S2 Codeine 3.1 0.41 1B-S3 Codeine 6.25 0.61

【问题讨论】:

  • 您能提供任何示例数据吗?我会根据药物的唯一值做一个 for 循环,然后将其保存在一个列表中。然后,此列表将包含所有不同的数据框。
  • 为此使用split
  • 已添加示例数据。抱歉 - 我应该把它放在前面。

标签: r loops subset


【解决方案1】:

在一个完全可重现的示例中,您可以使用:

  component <- c("A", "B", "C")
  value <- c(1, 2, 3)
  test <- data.frame(component, value)

  dataframe_list <- split(test, component)

然后您可以使用(例如)dataframe_list$A 访问不同的组件。或者更多手动可以使用:

  dataframe_list <- list()

  for(comp in test$component){
    dataframe_list[[length(dataframe_list)+ 1]] <-  test[which(test$component == comp),]
  }

这会将所有不同的子 data.frames 放在一个列表中,但每个组件都不容易访问。

【讨论】:

    【解决方案2】:

    拆分很有用,但我发现之后很难对埋在dataframe_list 中的数据进行计算。我发现如果我创建了一个名为Sample.Name.Level 的列来生成“AlprazolamA1”,例如使用:

    df$Sample.Name.Level&lt;-substr(df$Sample.Name, 1,2)

    然后我可以使用以下方法创建一个 for 循环:

    analytes<-unique(as.factor(df$Component.name)) df.names<-unique(as.character(df$Component.name)) for (i in 1:nlevels(analytes)) { loop.df<-subset(df, df$Component.name == analytes [i], loop.df$Sample.Name.Levelselect=c("Sample.Name.Level", "Component.name", "TCAmount", "Ratio")) loop.df$Sample.Name.Level<-(as.character)(loop.df$Sample.Name.Level) loop.df$Ratio<-(as.numeric)(loop.df$Ratio) try(plot(loop.df$TCAmount, loop.df$Ratio)) try(abline(loop.df)) assign(df.names2[i], loop.df)}

    然后在最后将分析物名称分配给子集数据框。

    【讨论】:

      猜你喜欢
      • 2021-04-04
      • 2021-01-14
      • 1970-01-01
      • 1970-01-01
      • 2013-03-31
      • 2018-07-26
      • 2019-10-24
      • 2011-06-26
      • 1970-01-01
      相关资源
      最近更新 更多