我有一个需要循环的数据框,并根据与我的计数器和下一行对应的行的值指定新的列值。我的问题是这样做最后一行打破了循环。
如果不存在[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"
}
答案 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,])