0

我有一个需要循环的数据框,并根据与我的计数器和下一行对应的行的值指定新的列值。我的问题是这样做的最后一行打破了循环。

如果不存在 [j+1] 行,我希望它做的不仅仅是将标准应用于我所拥有的行,例如在此代码的第 10 行,评估它是否大于 8,如果是,则制作大于 8ornext[10 ] = "是"

set.seed(2)
c <- rnorm (mean=10,sd=3, n=10)
a<- 1:10
ac<- as.data.frame (cbind(a,c))

for (j in 1:10){
  if (!(ac$c[j]<8|ac$c[j+1]<8)) ac$biggerthan8hereornext[j] <- "YES"
  else
    ac$biggerthan8hereornext[j] <- "NO"
}
4

2 回答 2

2

要回答您的问题,您只需添加一个额外的else if语句来明确检查行数:

for (j in 1:nrow(ac)){
    if (ac$c[j] > 8) 
        ac$biggerthan8hereornext[j] <- "YES"
    else if (nrow(ac) > j && ac$c[j+1] > 8)
        ac$biggerthan8hereornext[j] <- "YES"
    else
        ac$biggerthan8hereornext[j] <- "NO"
}

但是,这似乎很笨拙。更好的 R 方法是将比较矢量化:

## Create two vectors
## Remove the first element of c2 and pad out with FALSE
c1 = ac$c > 8
c2 = c((ac$c > 8)[-1], FALSE)

然后

ac$better = "No"
ac$better[c1 & c2] = "Yes"
ac    

R> ac
    a      c biggerthan8hereornext better
1   1  7.309                    NO     No
2   2 10.555                   YES    Yes
3   3 14.764                    NO     No
4   4  6.609                    NO     No
5   5  9.759                   YES    Yes
6   6 10.397                   YES    Yes
7   7 12.124                   YES    Yes
8   8  9.281                   YES    Yes
9   9 15.953                   YES    Yes
10 10  9.584                    NO     No
于 2013-08-22T08:27:08.620 回答
1

由于您总是知道有多少行,因此arows<- nrow(ac)只需将循环设置为for(j in 1:arows)),如果您需要更大的输出矩阵,那么

for (k in 1:(N-arows)) cbind(ac,ac[arows,])

于 2013-08-22T11:37:37.737 回答