【问题标题】:Double for loop in RR中的双重for循环
【发布时间】:2015-05-15 01:32:43
【问题描述】:

我想使用以下代码创建一个数据集,目的是在每组之间添加一个空白行,在每个处理之间添加三个空白行。我希望它看起来像以下数据集。

value group treatment
 39.7     A         1
 53.5     A         1
 51.1     A         1
 67.8     A         1

 84.8     B         1
 80.3     B         1
 79.6     B         1
 84.3     B         1



 31.0     C         2
 32.0     C         2
 33.0     C         2
 34.0     C         2

  1.0     D         2
  2.0     D         2
  3.0     D         2
  4.0     D         2

我写了一个双 for 循环,但效果不佳。我想不通。谁能告诉我它有什么问题?

mydata <- data.frame(value=c(39.7,53.5,51.1,67.8,84.8,80.3,79.6,84.3,31,32,33,34,1,2,3,4),group=c("A","A","A","A","B","B","B","B","C","C","C","C","D","D","D","D"),treatment=c(1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2))

blank <- data.frame(value=NA,group="NA",treatment=NA)
blank1 <- data.frame(value=c(NA,NA,NA),group=c("NA","NA","NA"),treatment=c(NA,NA,NA))

uni<-unique(mydata$treatment)
b<-length(uni)
out <- c()
out1<-c()

for (i in 1:b) {
  emp<-subset(mydata,treatment==uni[i])
  uni1<-unique(emp$group)
  c<-length(uni1)
  for (j in 1:c){
    emp1<-subset(subset(mydata,treatment==uni[i]),group==uni1[j])
    stack<-rbind(emp1,blank)
    out<-rbind(stack,out)
  }
  stack1<-rbind(out,blank1)
  out1<-rbind(stack1,out1)
}

【问题讨论】:

  • 您实际上想要空白观察,或者这只是为了打印它?
  • 哦,刚刚看了你的代码。重复使用emp 而不是嵌套subset 会不会那么混乱。此外,您要添加四个空白行,而不是三个(因为您已经从内行获得了一个空白)。最后,您需要在第一个循环中初始化out——对于每个新的treatment,它需要为空。
  • 嗨弗兰克,非常感谢您的回复。你是对的,我这样做是为了打印表格。您关于“在第一个循环内初始化”的建议太棒了,它解决了我的问题!!!哇~~我已经为此苦苦挣扎了很长时间.....非常感谢!
  • 没问题;很高兴你解决了它:)

标签: r


【解决方案1】:

我无法想象有这样一种模式的空白行数据的实际原因,所以我假设它只是为了打印:

printables <- lapply(
  split(mydata,mydata$treatment),
  function(t)
    split(t,as.character(t$group)))

for (t in seq_along(printables)){
  for(g in seq_along(printables[[t]])){
    print(printables[[t]][[g]],row.names=FALSE)
    cat('\n')
  }
  cat('\n\n')
}

【讨论】:

  • 嗨弗兰克,你能告诉我如何将这个“可打印文件”输出到 txt 文件或 csv 文件吗?非常感谢!!~~
  • sink("myfile.txt") 在循环之前和sink() 之后。对于 csv,如果您的上述循环有效,您可以使用 write.csv(out1,file="mycsvfile.csv")
  • another more.....抱歉有这么多问题....sink() 不能处理 NA,对吧?有什么可以帮助您在 txt 文件中将“NA”显示为空白吗?太感谢了!!!
  • @fruitJ 我不确定。您可能需要调整数据,以便将所有内容(偶数)转换为字符/字符串;用空字符串替换 NA;然后打印,如此处所述:stackoverflow.com/questions/19592706/setting-na-to-blank
  • 太棒了!!有用!!非常感谢~~~鲜花!@Frank
猜你喜欢
  • 2019-05-21
  • 1970-01-01
  • 2010-12-06
  • 1970-01-01
  • 2020-03-09
  • 1970-01-01
  • 1970-01-01
  • 2014-04-12
  • 2020-04-26
相关资源
最近更新 更多