首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过应用公式将重复的行合并为一个

通过应用公式将重复的行合并为一个
EN

Stack Overflow用户
提问于 2021-09-19 11:01:14
回答 2查看 93关注 0票数 1

在R中,我希望合并具有相同x,y坐标的数据点的行,这些数据点可以用公式合并,从而给出表示合并区域值的一行。(多茎树,但具有代表性的组合直径或横截面面积的同一种植物)因此,在这个数据框架的简单例子中:

代码语言:javascript
复制
{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行,并将其缩小为表示合并直径的一行,这类似于平均值,但更复杂一些(稍后我可以填写)。

我已经阅读和研究了这里所有关于删除重复的帖子,但我不想这样做,我想要巩固它们,留下一排具有代表性的直径或圆形区域,供同一种植物的合并茎使用。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-09-19 11:31:30

如果我正确地解释了您的问题,那么当前数据框架中的每一行都表示对特定位置的diam的度量。有许多由x,y值定义的唯一位置,但其中一些位置在数据帧中有多个行,表示同一站点上的多个度量。您希望能够通过在每个站点获取每个位置的diam度量向量并应用一些返回单个值的函数(例如summean)来总结每个唯一位置的diam值。

使用dplyr包可以很容易地做到这一点。您可以group_by每个唯一的位置,然后summarize在每个x,y位置的diam的所有值。

在下面的示例中,我使用了所有直径的简单sum,但您可以将其更改为以数字向量作为输入并提供单个数字输出(如maxmeanmedian等)的任何函数:

代码语言:javascript
复制
library(dplyr)
library(ggplot2)

forest %>% 
  group_by(x, y) %>% 
  summarize(diam = sum(diam)) %>%
  ggplot() +
  geom_point(aes(x, y, size = diam))

编辑

从几个单独直径中找出单个等效直径的功能是:

代码语言:javascript
复制
sum_diams <- function(x) 2 * sqrt(sum((x / 2)^2))

所以你的代码会变成:

代码语言:javascript
复制
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))

进一步编辑

要存储修改后的数据框架,可以执行以下操作:

代码语言:javascript
复制
new_forest <- forest %>% 
  group_by(x, y) %>% 
  summarize(diam = sum_diams(diam))

如果你想画它,你可以:

代码语言:javascript
复制
ggplot(new_forest) +
  geom_point(aes(x, y, size = diam))

如果您想进一步分析它,您的数据帧new_forest仍然在内存中。

票数 2
EN

Stack Overflow用户

发布于 2021-09-19 13:44:22

下面是一种使用基本管道的方法。sum_diams()借了的谢。

对于图例,我使用一个小助手函数mk()

代码语言:javascript
复制
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存储在两者之间。

代码语言:javascript
复制
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以前存在,它将被覆盖。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69242627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档