В списке есть три фрейма данных. Во-первых, я хочу, чтобы выбрать фрейм данных из меньшего количества строк, чтобы быть моим отсчета. И затем я хочу установить другие кадры данных на основе минимального расстояния от значений кадра эталонных данных. Вот пример:
Данные
a<- data.frame(name=c("a1","a2","a3","a4"), x=c(10,15,59,21),y=c(12,16,20,30))
b<- data.frame(name=c("b1","b2","b3","b4","b5"), x=c(8,9,2,-1,13),y=c(7,1,5,10,0))
c<- data.frame(name=c("c1","c2","c3","c4","c5","c6","c7"), x=c(1,5,6,2,3,10,-8),y=c(2,-3,7,4,6,15,8))
all<- list(a=a,b=b,c=c)
Здесь a выбрано в качестве ссылки, поскольку его nrow = 4. Теперь я хочу вычислить расстояние следующим образом:
a1b1, a1b2, a1b3, a1b4,a1b5
a2b1, a2b2, a2b3, a2b4,a2b5
a3b1, a3b2, a3b3, a3b4,a3b5
a4b1, a4b2, a4b3, a4b4,a4b5
, минимальное расстояние каждой строки которого будет добавлено к соответствующему подмножеству кадра данных b, называемого sub_b, следующим образом:
Ожидается Результат
> sub_b
name x y
1 b1 8 7
2 b3 2 5
3 b1 8 7
4 b3 2 5
аналогичным образом вычислите расстояние между a и c, а затем подмножество c на основе минимального расстояния
# a1c1, a1c2, a1c3, a1c4, a1c5, a1c6, a1c7
# a2c1, a2c2, a2c3, a2c4, a2c5, a2c6, a2c7
# a3c1, a3c2, a3c3, a3c4, a3c5, a3c6, a3c7
# a4c1, a4c2, a4c3, a4c4, a4c5, a4c6 , a4c7
и фрейм данных sub_ c должны иметь вид
# Ожидаемый результат
> sub_c
name x y
1 c3 6 7
2 c5 3 6
3 c3 6 7
4 c5 3 6
наконец, новый список new.all <- list ( a = a, sub_b = sub_b, sub_c = sub_ c) </p>
Вот мой код
lessRow<- lapply(all, function(x) nrow(x))
lessRow<- which.min(lessRow) # set the reference frame
A<- matrix(a$x, a$y, ,nrow=4,ncol = 2) # convert data frame to matrices
B<- matrix(b$x, b$y, ncol = 2,nrow = 5)
C<- matrix(c$x, c$y, ncol = 2,nrow = 7)
library(geosphere) # compute the distances
dis.ab<- distm(A, B,distGeo)
dis.ac<- distm(A, C,distGeo)
# select which points of dataframe b is closest to points a
minm.ab <- apply(A, 1, function(x) {
dm <- distm(x, B , fun=distGeo)
return(which.min(dm))
})
# select which points of dataframe c is closest to points a
minm.ac<- apply(A, 1, function(x) {
dm <- distm(x, C , fun=distGeo)
return(which.min(dm))
})
# subset based on the minmuim distance
sub_b<- b[minm.ab,]
sub_c<- c[minm.ac, ]
# create a new list of new data frames by keeping the reference frame (a) as it is.
new.all<- list (a=a, sub_b=sub_b, sub_c=sub_c)
Вопрос в том, как это сделать в l oop в качестве числа кадров данных больше 3.