【问题标题】:Problems with for and while loop in data frame数据框中的for和while循环问题
【发布时间】:2014-11-09 22:29:50
【问题描述】:

你能解释一下我在循环中的错误

数据集是这样的

    plot<-c("A", "B", "C")
    s<-c(0.3, 0.7, 0.6)
    pe<-c(0.7, 0.3, 0.4)

    a<-data.frame(plot, s, pe)

library(reshape)
a.long<-melt(a, id=c("plot")
a.long1<-a.long[order(a.long$plot, -a.long$value),]

现在我的两个循环不起作用

    a.long1$maxS<-0
while (i <= length(a.long1$plot)+1){
    if (a.long1$plot[i]==a.long1$plot[i+1]){
    a.long1$maxS[i]<-1
    } else {
      a.long1$maxS[i]<-0
    }
   i = i+ 1
  }

for (i in 1:length(a.long1$plot)){
  if (a.long1$plot[i] == a.long1$plot[i+1] ) {
    a.long1$maxS[i]=1
  } else { 
  a.long1$maxS[i]=0}
}

我理解我犯的错误,即在数据末尾声明 a.long1$plot[i] == a.long1$plot[i+1]NA 值,但我无法使其工作,即使尝试了几个小时。

【问题讨论】:

  • 请避免给plot赋值,因为它是一个内置函数。
  • 我更改了变量的名称,但仍然收到: if (a.long1$plotek[i] == a.long1$plotek[i + 1]) { : TRUE/FALSE 中的缺失值需要
  • 此处缺少右括号:a.long&lt;-melt(a, id=c("plot")i 没有为 while 语句定义,因此它是不可重现的。在for 循环中,i 必须介于 1 和 5 之间,如果您希望它工作的话。

标签: r loops for-loop while-loop


【解决方案1】:

你没有解释预期的输出,但我猜你想要这个:

a.long1$maxS <- as.numeric(c(head(a.long1$plot, -1) == tail(a.long1$plot, -1), NA))
#  plot variable value maxS
#4    A       pe   0.7    1
#1    A        s   0.3    0
#2    B        s   0.7    1
#5    B       pe   0.3    0
#3    C        s   0.6    1
#6    C       pe   0.4   NA

请记住,矢量化通常比 R 中的循环更可取。这里我通过从 plot 中删除最后一个元素和第一个元素来创建两个矢量,然后比较它们。然后我需要添加一个NA值,因为plot的最后一个值没有后续值。 as.numericTRUE/FALSE 强制为 0/1。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 2011-04-17
    • 1970-01-01
    相关资源
    最近更新 更多