如何跨两个不同的数据帧列表进行计算?

时间:2020-03-07 20:01:37

标签: r list dataframe lapply calculation

我有两个数据帧列表,因此数据是47个数据帧的列表,其中每个数据帧都有列[coords,x,y,liklihood,x.1,x.2,liklihood.1等。]和dataA是47个数据帧的列表,每个数据帧的长度与数据中的帧长度相同,但表示不同坐标的列[coords,x,y]较少。

我想创建第三个列表,或向其中一个列表中的每个数据框添加一列,其中将包含从pointDistance(p1,p2)的距离计算,其中p1是每个数据框的x和y列在列表数据中,p2是列表数据A中每个数据帧的x和y列。

我正在尝试将数据帧保留在列表中,而不是在我的全局环境中拥有47 * 2个单独的数据帧。

最小可复制示例:

coords <- rnorm(10)
x <- rnorm(10)
y <- rnorm(10)
liklihood <- rnorm(10)
x.1 <- rnorm(10)
y.1 <- rnorm(10)

day1 <-  data.frame(coords,x,y,liklihood,x.1,y.1)

coords <- rnorm(10)
x <- rnorm(10)
y <- rnorm(10)
liklihood <- rnorm(10)
x.1 <- rnorm(10)
y.1 <- rnorm(10)

day2 <-  data.frame(coords,x,y,liklihood,x.1,y.1)

data <- list(day1,day2)

coords <- rnorm(10)
x <- rnorm(10)
y <- rnorm(10)
liklihood <- rnorm(10)

day1 <-  data.frame(coords,x,y,liklihood)

coords <- rnorm(10)
x <- rnorm(10)
y <- rnorm(10)
liklihood <- rnorm(10)


day2 <-  data.frame(coords,x,y,liklihood)

dataA <- list(day1,day2)

1 个答案:

答案 0 :(得分:2)

您可以在基数R中使用mapply来完成此操作。

首先,编写一个函数,如果从您的两个列表中获得一对数据帧,例如data[[1]]dataA[[1]]

,它将返回一个正确的数据帧

library(raster)

append_distances <- function(df1, df2)
{
  df1$distance <- pointDistance(cbind(df1$x, df1$y), cbind(df2$x, df2$y), lonlat = FALSE)
  return(df1)
}

现在,我们只需将此函数和您的两个列表传递给mapply

data <-  mapply(append_distances, data, dataA, SIMPLIFY = FALSE)

现在data中的每个数据帧都添加了一个距离列:

data
#> [[1]]
#>        coords          x           y  liklihood         x.1        y.1  distance
#> 1   0.4761741  0.7913819  0.11597299 -0.6159504 -0.17626836 -0.8649915 2.1378779
#> 2   0.2608518  0.4389639 -1.44510285 -0.5452702 -2.31927588 -0.5114613 3.0321765
#> 3   2.1098629  0.3457442  1.59630572 -0.3205454  0.25760236  1.6791924 0.4150714
#> 4   0.5937334 -0.2043505  0.23667944 -0.2480409 -0.52856599 -0.4263619 1.6662791
#> 5   0.2819461 -1.9768319  0.68344331 -0.4975349 -0.08315893  0.9271072 2.3841079
#> 6   0.5779044 -0.5706433  0.89377684 -1.0084165 -0.83697268  0.9928353 0.6818632
#> 7   0.1410554 -0.6133513  0.25957971 -0.1781339 -0.77489990 -0.7191718 0.8303696
#> 8  -1.1769578  0.9203776 -0.06258728 -0.8991639 -0.38907408 -0.8388408 0.5028145
#> 9  -0.1388739 -0.8279408  1.15568431 -0.3312423  1.17269754 -1.4530041 1.6042288
#> 10 -0.3755364  0.6285803  0.52453490  0.7323463 -0.49051839 -0.1949171 0.6205714
#> 
#> [[2]]
#>        coords           x          y  liklihood        x.1          y.1  distance
#> 1   2.2158425  0.16430566 -0.5721804 -0.7523029  0.2866881 -2.027529031 0.4418775
#> 2   1.5753250 -0.67190607 -0.1140359 -0.3125333 -0.5361148  0.153228235 1.7182954
#> 3   0.8558108  1.19404509 -1.5834463  0.3858246  0.4475970  0.460910344 1.6229581
#> 4   0.8027824  0.76579023 -0.5938679  0.5592208  0.5883806  0.231569460 3.3608275
#> 5  -1.1487244  0.01013471  0.6855049  0.7148735 -2.2822053  1.918921619 2.3790501
#> 6   0.1014336  0.73941541 -0.4487482  0.1758588  0.8579709  0.029777437 1.8923570
#> 7  -0.8238857  0.67911991 -0.9140873 -0.6887611 -1.0709704 -0.009789701 1.4694983
#> 8  -0.1553338  0.78560221 -0.8218460 -0.5537232  0.7295692  0.744225760 2.4279377
#> 9  -0.6297834  0.09747354  0.2048211 -1.0849396 -0.2201589  0.173386536 0.8638957
#> 10 -0.4616377 -0.51116686  0.3204535 -0.5285903  1.0053890 -0.534173400 1.0715881
相关问题