首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >循环中的R因子以构建完整的数据帧

循环中的R因子以构建完整的数据帧
EN

Stack Overflow用户
提问于 2017-02-11 01:47:57
回答 1查看 189关注 0票数 0

我正在尝试编写一个循环,对每个“标签”的3个样本的数据执行anova和TukeyHSD。在这种情况下,Label是一种代谢途径。进入其中的数据是在上述代谢途径中表达的基因。

对于测试数据,我创建了一个小的df来重现我的错误。在我的实际数据中,我希望在两个因素(而不仅仅是一个因素)上执行此操作,并且我还有数千行。

代码语言:javascript
复制
library(reshape2)
df<-melt(data.frame(sample1 = c(0,0,3,4,5,1),sample2 = c(1,0,0,4,5,0),sample3 = c(0,0,0,8,0,0),Label = c("TCA cycle", "TCA cycle","TCA cycle", "Glycolysis","Glycolysis","Glycolysis"),Gene = c("k1","k2","k3","k4","k5","k6")))

我的方法(尽我所能以最好的方式注释!):

代码语言:javascript
复制
fxn<-unique(df$Label) #create list
for (i in 1:length(fxn)){
if (!exists("data")){ #if the "data" dataframe does not exist, start here!
  depth<-aov(df$value[df$Label==fxn[i]]~df$variable[df$Label==fxn[i]]) #perform anova on my "df", gene values as a factor of samples (for each "fxn")
  hsd<-TukeyHSD(depth) #calculate tukeyHSD
  data<-as.data.frame(hsd$`df$variable[df$Label == fxn[i]]`) #grab dataframe of tukey HSD output
  data$Label<-fxn[i] #add in the Label name as a column (so it looks like my original df, but with TukeyHSD output for each pairwise comparison
  data<-as.data.frame(data) 
}
if (exists("data")){ #if "data" exists, do this:
    tmpdepth<-aov(df$value[df$Label==fxn[i]]~df$variable[df$Label==fxn[i]])
    tmphsd<-TukeyHSD(tmpdepth)
    tmpdata<-as.data.frame(tmphsd$`df$variable[df$Label == fxn[i]]`)
    tmpdata$Label<-fxn[i]
    tmpdata<-as.data.frame(tmpdata)
    data<-rbind(data,tmpdata) #combine with original data 
    data<-as.data.frame
    rm(tmpdata)
  }
}

我希望我的输出是这样的:

代码语言:javascript
复制
                      diff       lwr      upr     p adj      Label
sample2-sample1 -0.3333333 -8.600189 7.933522 0.9916089 Glycolysis
sample3-sample1 -0.6666667 -8.933522 7.600189 0.9669963 Glycolysis
sample3-sample2 -0.3333333 -8.600189 7.933522 0.9916089 Glycolysis

但是Label列包含了"fxn“中的所有因素。

错误:

代码语言:javascript
复制
Error in rep(xi, length.out = nvar) : 
  attempt to replicate an object of type 'closure'
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-11 03:08:31

您忘记了rm(tmpdata)之前最后一行中的第二个data。应该是:data<-as.data.frame(data)

在我的实现中,我更改了您的代码,如下所示:

代码语言:javascript
复制
datav <- data.frame(diff = double(),
    lwr = double(),
    upr = double(),
    'p adj' = double(),
    'Label' = character())

for (fxn in unique(df$Label)){
    depth <- aov(df$value[df$Label==fxn] ~ df$variable[df$Label==fxn]) 
    hsd <- TukeyHSD(depth) 
    tmp <- as.data.frame(hsd$`df$variable[df$Label == fxn]`) 
    tmp$Label <- fxn 
    datav <- rbind(datav, tmp)
}

在初始化data.frame之前,您不需要if语句。另外,data是R中的一个函数,因此我将变量data重命名为datav。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42165640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档