将数据框中每一行的向量分成两半

Split vectors in each row in a dataframe in half

我在 R 中有一个包含一列的数据框。每行都有一个向量,该向量在该列中显示了不同数量的坐标:

       Column
1      c(66.3010025028633, 66.5439987180665, 86.6060028079833, 86.6549987795701)
2      c(66.5439987180665, 62.463001250907, 61.5060005190088, 58.0180015560271, 
         54.5610008237291, 50.770000457655, 47.522998810147, 46.0629997251572, 
         86.6549987795701, 86.7549972532207, 86.8050003054198, 86.7870025636175, 
         86.7460021972437, 86.7060012816339, 86.6409988399246, 86.597999572922)
3      c(46.0629997251572, 46.313999176321, 86.597999572922, 86.5609970096044)
4      c(70.0894851683059, 66.3010025028633, 86.4039611818631, 86.6060028079833)

确切的数据帧数据是:

dput(BoundaryCoordinates2[1:4,]) list(c(66.3010025028633, 66.5439987180665, 86.6060028079833, 86.6549987795701), c(66.5439987180665, 62.463001250907, 61.5060005190088, 58.0180015560271, 54.5610008237291, 50.770000457655, 47.522998810147, 46.0629997251572, 86.6549987795701, 86.7549972532207, 86.8050003054198, 86.7870025636175, 86.7460021972437, 86.7060012816339, 86.6409988399246, 86.597999572922), c(46.0629997251572, 46.313999176321, 86.597999572922, 86.5609970096044), c(70.0894851683059, 66.3010025028633, 86.4039611818631, 86.6060028079833))

我的最终目标是匹配坐标以创建定位点。

不幸的是,每个矢量按所有经度列出坐标,然后是所有纬度,并且每个矢量具有不同数量的坐标。我想将每个矢量分成两半以形成两个不同的矢量,我可以更轻松地使用它们来匹配坐标对。

示例:根据第 1 行的矢量,我想将第一个经度 (66.30...) 与第一个纬度 (86.60...) 配对,然后将第二个经度与第二个纬度配对。

我的下一步是将列拆分为两列,同时保留行。第一列包含原始向量的前半部分(经度),第二列包含原始向量的后半部分(纬度)。

无法将原始向量拆分成字符串,因为每个向量的坐标数不同

当我将 split() 用作:

newDF <- split(oldDF, 2)

它 returns 一个列表,其中一列包含所有值,一列包含“类型”,其中列出了“值”列中有多少个值。

如果我用

newDF <- split(oldDF$column, 2)

它 returns 一个错误,指出第一个参数必须是向量。

用 unnest_wider() 取消嵌套列也无助于当前步骤,因为那样我就无法轻松匹配坐标。我需要先分成两半再拆。

感谢您的任何见解!

您的 data.frame 有一个列表列。这些在 base R 中维护起来有点棘手,但如果你使用 I(),它会保持在一起。
因为该列是一个列表,所以您需要 lapply 遍历它。
我自己编的数据:

set.seed(42)
df <- data.frame(Column = I(list(rnorm(4), rnorm(16), rnorm(2), rnorm(8))))
df$Column
[[1]]
[1]  1.3709584 -0.5646982  0.3631284  0.6328626

[[2]]
 [1]  0.40426832 -0.10612452  1.51152200 -0.09465904  2.01842371 -0.06271410  1.30486965  2.28664539 -1.38886070 -0.27878877
[11] -0.13332134  0.63595040 -0.28425292 -2.65645542 -2.44046693  1.32011335

[[3]]
[1] -0.3066386 -1.7813084

[[4]]
[1] -0.1719174  1.2146747  1.8951935 -0.4304691 -0.2572694 -1.7631631  0.4600974 -0.6399949

拆分如下:

split_df <- lapply(df$Column, \(x) data.frame(
  lngs = I(list(x[1:(length(x) / 2)])), 
  lats = I(list(x[(length(x) / 2 + 1):length(x)]))))
split_df <- do.call('rbind', split_df)                 
split_df
          lngs         lats
1 1.370958.... 0.363128....
2 0.404268.... -1.38886....
3 -0.30663.... -1.78130....
4 -0.17191.... -0.25726....

这就是你说的拆分部分。如果你想要匹配,你需要具体说明结果应该是什么样子。