2015-06-16 51 views
6

比方說,我有以下的載體:組向量的數量相似

c(4, 5, 5, 8, 12, 12, 12, 13, 15, 15, 18, 19, 20, 23, 37, 37, 37, 37, 37, 41)

,我謹以「組」,其內容根據自己的價值:即不同< = 3應該是數字被認爲屬於同一組。 在這種情況下,我希望每個出現在向量中的數字都能得到所有接近它的數字。 例如,

4 --> c(4,5,5,8) 
5 --> c(4,5,5,8) 
8 --> c(5,8) 
12 --> c(12,12,12,13,15,15) 

可能的話,它可能是也得到他們的指數有用... 有沒有什麼聰明的方式來實現這一目標?

回答

9

你可以用這個小功能:

similar <- function(vec, val, bound = 3, index = F) { 
    close.index <- which(abs(vec - val) <= bound) 
    if (index) return(close.index) 
    return(vec[close.index]) 
} 

x <- c(4, 5, 5, 8, 12, 12, 12, 13, 15, 15, 18, 19, 20, 23, 37, 37, 37, 37, 37, 41) 
similar(x, 5) 
# [1] 4 5 5 8 
similar(x, 5, index = T) 
# [1] 1 2 3 4 
similar(x, 5, bound = 7) 
# [1] 4 5 5 8 12 12 12 
+1

不會傷害修改:'返回(列表(SIM = VEC [close.index],索引= close.index))' –

2

也許不是最優雅的版本,但是這並做你想擁有什麼?

x <- c(4, 5, 5, 8, 12, 12, 12, 13, 15, 15, 18, 19, 20, 23, 37, 37, 37, 37, 37, 41) 
vals <- unique(x) 
# print indices 
for (i in 1:length(vals)) print(which((x >= vals[i] - 3) & (x <= vals[i] + 3))) 
# print values 
for (i in 1:length(vals)) print(x[which((x >= vals[i] - 3) & (x <= vals[i] + 3))]) 

[1] 1 2 3 
[1] 1 2 3 4 
[1] 2 3 4 
[1] 5 6 7 8 9 10 
[1] 5 6 7 8 9 10 
[1] 5 6 7 8 9 10 11 
[1] 9 10 11 12 13 
[1] 11 12 13 
[1] 11 12 13 14 
[1] 13 14 
[1] 15 16 17 18 19 
[1] 20 

[1] 4 5 5 
[1] 4 5 5 8 
[1] 5 5 8 
[1] 12 12 12 13 15 15 
[1] 12 12 12 13 15 15 
[1] 12 12 12 13 15 15 18 
[1] 15 15 18 19 20 
[1] 18 19 20 
[1] 18 19 20 23 
[1] 20 23 
[1] 37 37 37 37 37 
[1] 41 

使用abs確實有點優雅。

for (i in 1:length(vals)) print(which(abs(x-vals[i]) <= 3)) 
for (i in 1:length(vals)) print(x[which(abs(x-vals[i]) <= 3)]) 
+0

感謝你們兩位的幫助! – Ruggero

0

這可能有助於創建一個數字列爲 「鑰匙」:

data <- c(4, 5, 5, 8, 12, 12, 12, 13, 15, 15, 18, 19, 20, 23, 37, 37, 37, 37, 37, 41) 
uniques <- unique(data) 

myGroups <- lapply(
    uniques, 
    function(n) Filter(
    function(x) abs(x - n) <= 3, 
    data 
) 
) 
names(myGroups) <- uniques 


myIndices <- lapply(
    uniques, 
    function(n) which(abs(data - n) <= 3) 
) 
names(myIndices) <- uniques 

然後,訪問組和索引爲 '12',說:

> myGroups[['12']] 
[1] 12 12 12 13 15 15 
> myIndices[['12']] 
[1] 5 6 7 8 9 10 
2

下面是一個簡短的解決方案,將所有組作爲一個列表:

x = c(4, 5, 5, 8, 12, 12, 12, 13, 15, 15, 18, 19, 20, 23, 37, 37, 37, 37, 37, 41) 

m = unique(x) 
setNames(apply(abs(outer(m,m,'-')), 2, function(u) m[u<=3]),m) 

#$`4` 
#[1] 4 5 

#$`5` 
#[1] 4 5 8 

#$`8` 
#[1] 5 8 

#$`12` 
#[1] 12 13 15 

#$`13` 
#[1] 12 13 15 

#$`15` 
#[1] 12 13 15 18 

#$`18` 
#[1] 15 18 19 20 

#$`19` 
#[1] 18 19 20 

#$`20` 
#[1] 18 19 20 23 

#$`23` 
#[1] 20 23 

#$`37` 
#[1] 37 

#$`41` 
#[1] 41 

對於索引,相同的概念可以容易地應用於:

setNames(apply(abs(outer(m,m,'-')), 2, function(u) which(x %in% m[u<=3])),m) 
+0

迄今爲止最好的解決方案。 'outer'是一些強大的東西。 +1 –