2012-11-25 187 views
1

如何創建一個矢量S的列表,查找最接近值整數

S[i] = 1, if Tv[i]是最接近數目的一個整數I<- 6:10 S[i] = 0 else

Tv <- c(5.946, 5.978, 
6.01, 6.043, 6.075, 6.109, 6.14, 6.173, 6.205, 6.239, 
6.273, 6.309, 6.344, 6.379, 6.415, 6.45, 6.486, 6.521, 6.556, 
6.59, 6.627, 6.665, 6.703, 6.741, 6.778, 6.816, 6.852, 6.891, 
6.928, 6.967, 7.005, 7.045, 7.084, 7.124, 7.161, 7.202, 7.24) 

S <- getS(Tv) 

> dput(S) 
c(0, 0, 1, 0, 0 ....) 

的最終目標是有一個列表就像1中的一個標尺,其值最接近下一個整數值。

+4

不要調用變量'T',因爲這是R中'TRUE'的快捷方式。 – Roland

+0

確實。並且,請注意,不要使用'T'作爲'TRUE'或'F'的快捷鍵作爲'FALSE'的快捷鍵,因爲人們傾向於用這些名稱來分配變量。 –

+0

好點。事實上,我的變量是mydf $ T,應該沒問題。 –

回答

4

這裏有一種方法:

I <- 6:10 
S <- numeric(length(T)) 
S[sapply(I, function(i) which.min(abs(i - T)))] <- 1 
S 
[1] 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 
+0

爲什麼你最後有1個? – agstudy

+0

因爲最後一個數字最接近8,9,10,它們在'I' – Julius

+0

中,但它不會給出與其他解決方案相同的結果! – agstudy

2

這並不是要求你給I,只是查找值最接近最接近的整數:

test <- c(5.946, 5.978,6.01, 6.043, 6.075, 6.109, 6.14, 6.173, 6.205, 6.239, 6.273, 6.309, 6.344, 6.379, 6.415, 
     6.45, 6.486, 6.521, 6.556, 6.59, 6.627, 6.665, 6.703, 6.741, 6.778, 6.816, 6.852, 6.891, 
     6.928, 6.967, 7.005, 7.045, 7.084, 7.124, 7.161, 7.202, 7.24) 

res <- integer(length(test)) 
res[abs(test-round(test)) %in% c(by(test,round(test), 
            FUN=function(test) min(abs(test-round(test)))))] <- 1 
#[1] 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 
0

一號線解決方案

diff(floor(c(T[1],T))) 
+1

這取決於所訂購的載體。 – Roland

+1

它沒有給出'c(0.99,1.1)'的正確結果。 – Roland

+0

@Roland你是對的,但我給出了問題中給出的例子的解決方案。 – agstudy

相關問題