我有两个数据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)
答案 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