2014-03-07 137 views
1

我想有一個測試,看看我的數據是否有意義,所以我想比較我的數據集的2列。它與距離有關,所以我比較Yn - Yn-1和Xn - Xn-1。奇怪的輸出長度使用

x<-c(1,2,3,0,2,0,5,8,2,10,2,0,1,0) 
CSx<-cumsum(x) 
y<-c(1,1.5,2,2,3,3,2,6,1,8,9,10,11,12) 
test1<-as.data.frame(cbind(x, CSx, y)) 
bla<-NA 
for (n in 2:length(test1[,1])){ 
j<-test1[n,2] 
k<-test1[n-1,2] 
l<-test1[n,3] 
m<-test1[n-1,3] 
ifelse((l-m)/(j-k)>1, bla<-append(bla, "WRONG!!!"), bla<-append(bla, "ok")) 
} 

因此,我期望有length(test1)值,第一個是NA,然後13個計算出的值,從2到在這些殼體14。我只得到12:

> length(2:length(test1[,1])) 
# [1] 13 
> bla 
# [1] NA   "ok"  "ok"  "ok"  "ok"  "ok"  
# [7] "ok"  "ok"  "ok"  "WRONG!!!" "ok"  "WRONG!!!" 
> length(bla) 
# [1] 12 

我想這是一個完全合乎邏輯和簡單的原因,但我完全困惑。

+0

短替代:'一個= DIFF(CSX); b = diff(y); B> A'。 'diff'計算值n和值n-1之間的差值。這裏沒有區分,所以錯誤信息不會出現。 – koekenbakker

回答

1

如果你把這個命令cat(n," ",(l-m)/(j-k),"\n")在for循環中,你會看到,n等於4和6 (l-m)/(j-k)等於NA因爲0/0NaN在R.因此功能ifelse不起作用。你必須處理NA值。

例如:

x<-c(1,2,3,0,2,0,5,8,2,10,2,0,1,0) 
CSx<-cumsum(x) 
y<-c(1,1.5,2,2,3,3,2,6,1,8,9,10,11,12) 
test1<-as.data.frame(cbind(x, CSx, y)) 
bla<-NA 

for (n in 2:length(test1[,1])){ 
    j<-test1[n,2] 
    k<-test1[n-1,2] 
    l<-test1[n,3] 
    m<-test1[n-1,3] 

    if (is.na((l-m)/(j-k))) 
     bla <- append(bla, "whatever you want") 

    ifelse((l-m)/(j-k)>1, bla<-append(bla, "WRONG!!!"), bla<-append(bla, "ok")) 

} 
+0

好吧,它確實有道理!非常感謝! – Yamazaki