for loop / if语句,用于引用数据框中不存在的单元格

时间:2013-08-22 08:12:38

标签: r

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

如果不存在[j + 1]行,我希望它只是将标准应用于我所拥有的行,例如在此代码的第10行,评估它是否大于8,如果是,请make biggerthan8ornext [10] =“YES”

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"
}

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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