繁体   English   中英

如何从 1 个 df 的第 i+1 列中获取值并计算到第 2 个 df 的第 i+1 列中每一行中的值的距离

[英]How to take value from i+1th column of 1 df and calculate distance to values in every row in i+1th column of 2nd df

假设我有以下两个数据框(行不均匀)

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 个观测值)。

我想做的是找到 dfXY 变量 1 的观察值与 dfAB 变量 1 中每个单独观察值之间的距离,dfXY 变量 2 的观察值 1 与 dfAB 变量 2 中每个单独观察值之间的距离,等等.

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 等等...
和之间的距离:a) 1,2 & 3,2 b) 1,2 & 3,1 c) 1,2 & 1,2 等等。
等等。

如果数据集具有相同数量的观察值,我可以使用:

distances <- map2_df(
  dfAB,
  dfXY,
  ~ sqrt((.x$x - .y$x)^2 + (.x$y - .y$y)^2)
)

但是由于 dfXY 只有 1 个观察值(要反复比较),所以这是行不通的。 我想我需要使用类似for(i in seq_along())函数的东西,但我不知道如何合并~ sqrt((.x$x -.y$x)^2 + (.x$y -.y$y)^2)

distance <- for(i in seq_along(dfXY)){
  dfAB[,i] <- dfAB[,i] [WHAT TO PUT HERE]

任何帮助深表感谢

我很难理解你在这里要做的事情,但我认为你可能会让事情变得太过不必要地复杂化。

例如,不是在lapply()调用中嵌套map2()调用,我认为您可以在不使用bind_cols()迭代的情况下获得几乎相同的结果:

dfA <- tibble(x = rpois(10,2), y = rpois(10,2), z = rpois(10,2), q = rpois(10,2), t = rpois(10,2))
dfB <- tibble(x = rpois(10,2), y = rpois(10,2), z = rpois(10,2), q = rpois(10,2), t = rpois(10,2))

df_abt <- dfA %>%
  bind_cols(dfB) %>%
  select(x, x1, y, y1, z, z1, q, q1, t, t1)

对于数据框 C 和 D,您可以使用带地图的迭代来避免转置它们:

dfC <- map(1:5, ~ .x) %>% bind_cols()
dfD <- map(11:15, ~.x) %>% bind_cols()

df_cdt <- dfC %>%
  bind_cols(dfD) %>%
  select(V1, V11, V2, V21, V3, V31, V4, V41, V5, V51)

(实际上为什么不将 df_cdt 存储为向量?是否有理由需要将其作为数据框?)

至于距离,我认为这应该可行:

df_dist <- map2_df(df_abt, df_cdt, ~ sqrt((.x - .y)^2))

如果 df_abt 中的行数不相等,为什么不用 NA 填充缺失的行呢? 我的意思是,它不会让你构建一个包含不同长度列的数据框。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM