繁体   English   中英

在 R 中,如何根据两个条件对一列的值求和,并按另一列值分组?

[英]How to sum values of one column, based on two conditions, grouped by another column value, in R?

我有一个包含许多“横断面”的数据集,多个“横断面”包含一个“平面”(例如平面 P1 = 横断面 T1 + 横断面 T2)

当前的数据结构(参见下面的示例)在“横断面长度”列中为横断面中收集的每个样本重复了每个横断面的长度。 我需要对横断面长度求和以获得每个平面的“平面长度”。

这是我得到的数据结构的样子:

平面名称 断面名称 横断面长度 样本
P1 T1 1002 X
P1 T1 1002
P1 T2 1034 z
P1 T2 1034 一种
P1 T2 1034 b
P2 T3 1222 c
P2 T3 1222 d
P2 T4 1324 电子

我添加了一个“索引”列,认为必须有某种方法可以在该行的索引 = 1 时添加横断面长度。

data3 <- data2 %>%
  group_by(transect)%>%
  mutate(index = seq(n())) %>%
  ungroup() %>%

显示添加的索引列的表:

平面名称 断面名称 横断面长度 样本 指数
P1 T1 1002 X 1个
P1 T1 1002 2个
P1 T2 1034 z 1个
P1 T2 1034 一种 2个
P1 T2 1034 b 3个
P2 T3 1222 c 1个
P2 T3 1222 d 2个
P2 T4 1324 电子 1个

但现在我被困在如何为某个平面仅添加索引 = 1 的样带长度,并遍历所有平面......

因此,例如,最后,我需要它看起来像这样:

平面名称 断面名称 横断面长度 样本 指数 平面长度
P1 T1 1002 X 1个 2036
P1 T1 1002 2个 2036
P1 T2 1034 z 1个 2036
P1 T2 1034 一种 2个 2036
P1 T2 1034 b 3个 2036
P2 T3 1222 c 1个 2546
P2 T3 1222 d 2个 2546
P2 T4 1324 电子 1个 2546

请注意,平面 P1 的平面长度是索引 = 1 的 T1 样线长度的总和。因此:1002 + 1034 = 2036,而不是1002 + 1002 + 1034 + 1034 + 1034 = 5106。

我使用 mutate、sum、summarize 等尝试了几种代码变体,但没有成功:

plane_lengths <- data3 %>% 
  mutate(plane_length = sum(transect_length[index ==1]))

^ 这个似乎什么都不做。 :(

plane_lengths <- data3 %>% group_by(plane_name) %>% summarize(plane_length = sum(transect_length))

^ 这只是添加横断面长度的每个值(所有索引值,而不仅仅是索引 = 1)

有什么方法可以修改上面的代码,只取索引 = 1 的横断面长度的值吗?

我对 R 还是有点陌生,非常感谢能得到的任何帮助。!! 谢谢你。

创建“索引”后,在创建“PlaneLength”列之前将分组更改为“Planename”

library(dplyr)
data2 %>% 
   group_by(Transectname) %>% 
   mutate(index = row_number()) %>% 
   group_by(Planename) %>% 
   mutate(PlaneLength = sum(Transectlength[index == 1])) %>%
   ungroup

-输出

# A tibble: 8 × 6
  Planename Transectname Transectlength Sample index PlaneLength
  <chr>     <chr>                 <int> <chr>  <int>       <int>
1 P1        T1                     1002 x          1        2036
2 P1        T1                     1002 y          2        2036
3 P1        T2                     1034 z          1        2036
4 P1        T2                     1034 a          2        2036
5 P1        T2                     1034 b          3        2036
6 P2        T3                     1222 c          1        2546
7 P2        T3                     1222 d          2        2546
8 P2        T4                     1324 e          1        2546

我们也可以使用with_groups这样它就不会创建组属性

data2 %>% 
  with_groups(Transectname, mutate, index = row_number()) %>%
  with_groups(Planename, mutate, 
    PlaneLength = sum(Transectlength[index == 1]))

-输出

 Planename Transectname Transectlength Sample index PlaneLength
1        P1           T1           1002      x     1        2036
2        P1           T1           1002      y     2        2036
3        P1           T2           1034      z     1        2036
4        P1           T2           1034      a     2        2036
5        P1           T2           1034      b     3        2036
6        P2           T3           1222      c     1        2546
7        P2           T3           1222      d     2        2546
8        P2           T4           1324      e     1        2546

数据

data2 <- structure(list(Planename = c("P1", "P1", "P1", "P1", "P1", "P2", 
"P2", "P2"), Transectname = c("T1", "T1", "T2", "T2", "T2", "T3", 
"T3", "T4"), Transectlength = c(1002L, 1002L, 1034L, 1034L, 1034L, 
1222L, 1222L, 1324L), Sample = c("x", "y", "z", "a", "b", "c", 
"d", "e")), class = "data.frame", row.names = c(NA, -8L))

暂无
暂无

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

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