循环数据帧生成

时间:2015-11-30 20:59:46

标签: r loops subset

我希望将大型数据框(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

2 个答案:

答案 0 :(得分: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放入列表中,但每个组件无法轻松访问。

答案 1 :(得分:0)

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

df$Sample.Name.Level<-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)}

然后,它还将分析物名称分配给子集化数据帧。