假设我有一个距离矢量(米):
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 的方式来实现同一目标。
答案 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