Предположим, у меня есть следующие два кадра данных (с неровными строками)
set.seed(1999)
dfA <- data.frame(x = rpois(10,2), y = rpois(10,2), z = rpois(10,2), q = rpois(10,2), t = rpois(10,2))
set.seed(24)
dfB <- data.frame(a = rpois(10,2), b = rpois(10,2), c = rpois(10,2), d = rpois(10,2), e = rpois(10,2))
set.seed(10)
Dx <- sample.int(5)
set.seed(6)
Dy <- sample.int(5)
Dx <- as.data.frame(Dx)
Dx <- as.data.frame(transpose(Dx))
Dy <- as.data.frame(Dy)
Dy <- as.data.frame(transpose(Dy))
dfAB <- map2_df(dfA, dfB, str_c, sep=",") %>%
rename_all(~ str_c('C', seq_along(.)))
dfXY <- map2_df(Dx, Dy, str_c, sep=",") %>%
rename_all(~ str_c('C', seq_along(.)))
Теперь у меня есть 2 набора данных координат (dfAB 5 переменных каждая с 10 наблюдениями, набор данных dfXY 5 переменных с 1 наблюдением).
Что мне хотелось бы, так это новый кадр данных с расстоянием между наблюдением переменной 1 dfXY и каждым отдельным наблюдением в переменной 1 dfAB, расстоянием между наблюдением 1 переменной 2 dfXY и каждым отдельным наблюдением в переменной 2 из dfAB, et c.
Если у нас есть
dfAB dfXY
3,1 3,2 ... 3,5 1,2 2,1 5,4 4,3
2,1 3,1
2,3 1,2
... ...
, то новый фрейм данных должен содержать расстояние между: a) 3,5 и 3,1 b) 3, 5 & 2,1 c) 3,5 & 2,3 et c ...
и расстояние между: а) 1,2 и 3,2 б) 1,2 и 3,1 c) 1,2 & 1,2 et c ..
и т. Д. С желаемым форматом вывода:
dfABXY
C1: C2: C3: C4: C5 etc...
4.000000 2.000000 1.000000 3.605551
4.123106 2.236068 1.414214 3.605551
2.236068 0.000000 2.236068 4.242641
3.162278 0.000000 1.000000 3.605551
3.162278 1.414214 2.000000 2.000000
etc... etc... etc... etc...
Однако, когда я использую:
distances <- map2_df(
dfAB,
dfXY,
~ sqrt((.x$x - .y$x)^2 + (.x$y - .y$y)^2)
)
Я получаю ошибку Error in .x$x : $ operator is invalid for atomic vectors
Я думаю, что мне нужно использовать что-то вроде for(i in seq_along())
функции, но я не знаю, как включить * 10 23 *
distance <- for(i in seq_along(dfXY)){
dfAB[,i] <- dfAB[,i] [WHAT TO PUT HERE]
Обратите внимание, что мой фактический набор данных - это тысячи строк и столбцов, поэтому я вызываю строки / столбцы вручную, нежизнеспособно.
Любая помощь приветствуется