根据另一个

时间:2017-08-22 11:33:50

标签: r

我有两个数据x和y的向量。假设第一个是距离,第二个是温度。

如何从x和y中删除距离较低的两个连续点(xi-xi-1)之间的恒定距离“d”的所有点

x = (1,2,3,8,12)
y = (10,12,11,9,12)

删除距离小于5的点

x  = 1, 2(out as 2-1 <5), 3 (out as 3-1 <5), 8, 12 (fine as last even thoug 12-8<5)
x  = (1,8,12)
y  = (10,9,12)

1 个答案:

答案 0 :(得分:2)

假设您的第一个和最后一个元素永远不会删除,这是一个想法,

v1 <- setNames(x, y)[c(TRUE, (diff(x) >= 5)[-(length(x)-1)], TRUE)]
#10  9 12 
# 1  8 12 

#To make it a bit more clear on how the named vector is structured (still a vector)

names(v1)
#[1] "10" "9"  "12"    <- Note: I get 9 whereas you get 11

unname(v1)
#[1]  1  8 12

或者你可以把它变成一个功能,

rm_elements <- function(x, y, n){
  v1 <- setNames(x, y)[c(TRUE, (diff(x) >= n)[-(length(x)-1)], TRUE)]
  return(list(x = unname(v1), y = as.numeric(names(v1))))
}

rm_elements(x, y, 5)
#$x
#[1]  1  8 12

#$y
#[1] 10  9 12

编辑:为了适应您在数据框中拥有它们的注释,我们可以稍微改变一下该函数以接受数据框(无论您如何命名变量),以及返回该数据框的子集,即

rm_elements <- function(df, n){
  v1 <- df[c(TRUE, (diff(df[[1]]) >= n)[-(nrow(df)-1)], TRUE),]
  return(v1)
}

#Make a data frame from the vectors,
d1 <- data.frame(x=x, y=y)

 rm_elements(d1, 5)

给出,

   x  y
1  1 10
4  8  9
5 12 12