在R中,我希望合并具有相同x,y坐标的数据点的行,这些数据点可以用公式合并,从而给出表示合并区域值的一行。(多茎树,但具有代表性的组合直径或横截面面积的同一种植物)因此,在这个数据框架的简单例子中:
{x <- c(6, 6, 6, 2, 2, 3, 4, 4, 7, 8)
y <- c(6, 6, 6, 4, 3, 7, 4, 6, 6, 10)
diam <- c(12, 9, 7, 16, 19, 4, 7, 8, 9, 3)
forest <- tibble(x,y, diam)
ggplot(data = forest) +
geom_point(mapping = aes(x = x, y = y, size = diam))
}我想要做的是分离重复的x,y行,并将其缩小为表示合并直径的一行,这类似于平均值,但更复杂一些(稍后我可以填写)。
我已经阅读和研究了这里所有关于删除重复的帖子,但我不想这样做,我想要巩固它们,留下一排具有代表性的直径或圆形区域,供同一种植物的合并茎使用。
发布于 2021-09-19 11:31:30
如果我正确地解释了您的问题,那么当前数据框架中的每一行都表示对特定位置的diam的度量。有许多由x,y值定义的唯一位置,但其中一些位置在数据帧中有多个行,表示同一站点上的多个度量。您希望能够通过在每个站点获取每个位置的diam度量向量并应用一些返回单个值的函数(例如sum或mean)来总结每个唯一位置的diam值。
使用dplyr包可以很容易地做到这一点。您可以group_by每个唯一的位置,然后summarize在每个x,y位置的diam的所有值。
在下面的示例中,我使用了所有直径的简单sum,但您可以将其更改为以数字向量作为输入并提供单个数字输出(如max、mean、median等)的任何函数:
library(dplyr)
library(ggplot2)
forest %>%
group_by(x, y) %>%
summarize(diam = sum(diam)) %>%
ggplot() +
geom_point(aes(x, y, size = diam))

编辑
从几个单独直径中找出单个等效直径的功能是:
sum_diams <- function(x) 2 * sqrt(sum((x / 2)^2))所以你的代码会变成:
library(dplyr)
library(ggplot2)
sum_diams <- function(x) 2 * sqrt(sum((x / 2)^2))
forest %>%
group_by(x, y) %>%
summarize(diam = sum_diams(diam)) %>%
ggplot() +
geom_point(aes(x, y, size = diam))进一步编辑
要存储修改后的数据框架,可以执行以下操作:
new_forest <- forest %>%
group_by(x, y) %>%
summarize(diam = sum_diams(diam))如果你想画它,你可以:
ggplot(new_forest) +
geom_point(aes(x, y, size = diam))如果您想进一步分析它,您的数据帧new_forest仍然在内存中。
发布于 2021-09-19 13:44:22
下面是一种使用基本管道的方法。sum_diams()借了的谢。
对于图例,我使用一个小助手函数mk()。
mk <- \(x, f=5) {o <- unique(round(min(x):max(x)/f))*f;o[o > 0]}
forest |>
with(aggregate(list(diam=diam), list(x=x, y=y), FUN=sum_diams)) |>
{\(x) new_forest <<- x}() |>
with(plot(x, y, pch=20, cex=diam/6, main="Forest")) |>
with(legend('topleft', legend=mk(diam), title='diam', pch=20, pt.cex=mk(diam)/6))

new_forest存储在两者之间。
new_forest
# x y diam
# 1 2 3 19
# 2 2 4 16
# 3 4 4 7
# 4 4 6 8
# 5 6 6 28
# 6 7 6 9
# 7 3 7 4
# 8 8 10 3注意:如果 new_forest以前存在,它将被覆盖。
https://stackoverflow.com/questions/69242627
复制相似问题