提取指定倍数的值的索引

时间:2018-03-13 07:10:00

标签: r

假设我有一个距离矢量(米):

my.distance <- c(0, 61, 122, 182, 242, 302, 363, 424, 485, 548, 611, 673,
                 735, 859, 920, 982, 1044, 1105, 1166, 1227, 1288, 1348,
                 1410, 1471, 1532, 1593, 1655, 1716, 1778, 1839, 1901, 1963, 
                 2025)

我想将那些500的倍数距离的索引号拉出到另一个向量中,比如my.500s。如果没有距离恰好是500的倍数,那么将采用下一个最大值:

print(my.500s)
[1] 10  17  25  33

我设法以一种黑客的方式做到了:

my.distance.500round <- floor(my.distance/500)           #round distances to 500 m
diff.distance <- cumsum(table(my.distance.500round))     #how many of each is there
diff.distance.minus <- table(my.distance.500round)-1     #the above minus 1
my.500 <- as.numeric(diff.distance-diff.distance.minus)  #subtract the 
                                                         #difference to get 
                                                         #the index numbers
print(my.500)                                            #Tadaaaaaaa!
my.distances[my.500]                                     #The end goal

这有点啰嗦,我在R做过事情,其他人向我展示了更快的技术,例如。只使用一行代码。我想知道这是否有更短,更优雅, R 的方式来实现同一目标。

3 个答案:

答案 0 :(得分:3)

你可以试试这个

# For indexes 
> which(diff(floor(c(0, my.distance)/500))==1)
#[1] 10 17 25 33

#For values
my.distance[which(diff(floor(c(0, my.distance)/500))==1)]
#[1]  548 1044 1532 2025

答案 1 :(得分:1)

我认为你可以与欧几里德分部做些不同的事情。

my.distance%/%500
my.distance%%500
my.500 <- data.table(my.distance%/%500,my.distance%%500,my.distance,c(1:length(my.distance)))

my.500 <- my.500 %>% group_by(V1) %>% slice(which.min(V2))

<强> #Distances

my.500$my.distance
[1]    0  548 1044 1532 2025

<强> #Indexes

my.500$V4
[1]  1 10 17 25 33

我现在解释一下。第一行,我们计算除法的商。然后,我们采取分裂的剩余部分。我创建了一个data.table来使它更美观。然后我们只需要用商来保持最低余数组的行。因此,您可以使用dplyr group_by使其变得漂亮。

我希望你没事。

答案 2 :(得分:0)

如果您还需要选择号码1593,可以尝试:

> which(c(floor(my.distance/100)) %% 5 == 0 & my.distance > 500)
[1] 10 17 25 26 33
> my.distance[which(c(floor(my.distance/100)) %% 5 == 0 & my.distance > 500)]
[1]  548 1044 1532 1593 2025